2维表,为什么有NullPointerException

时间:2014-09-14 10:37:54

标签: java nullpointerexception

我有这样的代码:

   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”值。

5 个答案:

答案 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的原因。