我有这样的代码:
public class SumNum {
int inside;
SumNum(int inside){
this.inside = inside;
}
public int getInside(){
return inside;
}
public static void main(String[] args) {
SumNum[][] tab = new SumNum[3][];
for (int i = 0; i < tab.length; i++) {
for (int j = 0; j < tab.length; j++) {
tab[i][j] = new SumNum(i);
System.out.println(tab[i][j]+" "+tab[i][j].hashCode()+" "+tab[i][j].getInside());
}
}
}
}
我没有设置第二维数组的大小。不应该有数组超出绑定的异常,因为第二个循环索引(j
)受到数组长度的限制而且Ok,它可以工作。
问题是:为什么有NullPointerException
?应该创建对象,因此它没有“null”值。
答案 0 :(得分:2)
除非在2D数组tab
中指定了第二个数组维,否则将创建一个包含null
值的数组,使用该数组作为Object
数组中元素的默认未分配值。使用
System.out.println(Arrays.deepToString(tab));
将产生
[null, null, null]
尝试分配值
tab[i][j] = new SumNum(i);
生成NPE
答案 1 :(得分:1)
由于未定义第二维,因此请访问:
tab[i][j]
对于像i = 0和j = 1这样的参数,当你尝试访问null对象时会产生明显的NullPointerException。
根据您的代码数组选项卡将如下:
[null,null,null]
答案 2 :(得分:1)
有NullPointerException
因为:
tab[i][j] = new SumNum(i);
尝试访问空数组对象
j未在SumNum[][] tab = new SumNum[3][];
如果您将代码更改为:
SumNum[][] tab = new SumNum[3][3]; it will work.
答案 3 :(得分:1)
由于您只声明一个维度的大小,因此您需要通过指定其大小来为其他维度分配内存。下面的“附加行”将解决您的问题。
public static void main(String[] args) {
SumNum[][] tab = new SumNum[3][];
for (int i = 0; i < tab.length; i++) {
//Additional line
tab[i] = new SumNum[ANYSIZE_HERE];
for (int j = 0; j < tab.length; j++) {
tab[i][j] = new SumNum(i);
System.out.println(tab[i][j]+" "+tab[i][j].hashCode()+" "+tab[i][j].getInside());
}
}
}
答案 4 :(得分:0)
您在此处仅定义了一个维度:
tab [i] [j]
当您尝试获得j = 1时,您尝试访问空对象。这就是为什么您得到NullPointerException的原因。