2014-09-14 3 views
0

У меня есть такой код:2 двухмерная таблица, почему есть 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».

+0

Вы должны использовать отладчик (или просто печатать заявления), чтобы проверить свои предположения. –

ответ

2

Если второй размер массива не указан в 2D массиве tab, массив, содержащее значение null будет создан с использованием которая неприсвоенное значение по умолчанию для элементов в массиве Object. Использование

System.out.println(Arrays.deepToString(tab)); 

будет производить

[null, null, null] 

Попытка присвоить значение

tab[i][j] = new SumNum(i); 

производит NPE

0

Поскольку второе измерение не определен, то доступ, как:

tab[i][j] 

для таких аргументов, как i = 0, и j = 1 будет производить очевидное исключение NullPointerException при попытке доступа к нулевому объекту.

Согласно вкладке массива кода будет выглядеть следующим образом:

[NULL, NULL, NULL]

0

Существует NullPointerException, потому что:

tab[i][j] = new SumNum(i); 

попытка доступа к нулевому объекту массива

j не определен в SumNum[][] tab = new SumNum[3][];

если вы измените код на:

SumNum[][] tab = new SumNum[3][3]; it will work. 
0

Поскольку вы объявляете размер только в одном измерении, то необходимо выделить память для другого измерения, указав его размер. Ниже приведена дополнительная строка.

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()); 
     } 
    } 

} 
Смежные вопросы