2014-01-11 7 views
2

У меня есть этот код, который не работает:Почему это для каждого цикла не работает?

Panel[] panelArr = new Panel[5]; 

for (Panel p:panelArr) { 
    p = new Panel(); 
} 
Label lblName = new Label("Name:"); 
panelArr[0].add(lblName); 

Это приходит с ошибкой:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
     at GUIVehicles$NewSportsCarDialog.<init>(GUIVehicles.java:65) 

Однако если заменить на-каждый цикл с этим для цикла он работает.

for (int i = 0; i < 5; i++) { 
    panelArr[i] = new Panel(); 
} 

Насколько я могу судить, просматривая документацию для каждого цикла, оба цикла должны быть эквивалентными. Ясно, что это не так, и мне было интересно, почему?

ответ

7

Ваш обмен на каждый аналогично этому:

for (int i = 0; i < 5; i++) { 
    Panel p = panelArr[i]; 
    p = new Panel(); 
} 

Поэтому назначение p явно не имеет никакого влияния на сам массив - вы просто перенаправлять p указать куда-то, что имеет нет никакого отношения к массиву. Поэтому в конце цикла for-each все элементы массива все еще находятся null. Ваш второй фрагмент является подходящим способом заполнения массива.

+3

Взрыв на! Прямо в точку. :) –

+0

Большое спасибо. Я был уверен, что я не понимаю его на самом базовом уровне, и это оказалось правильным. –

0

Потому что p является локальной переменной, это не panelArr[i] напрямую.

В вашем первом цикле вы в основном назначаете новой панели на p, а не на panelArr[i].

Подумайте о p и panelArr[i] как о двух переменных, указывающих объектам типа Panel. Тот факт, что вы инициализируете p, не означает, что вы также инициализировали panelArr[i].

0

В первом цикле вы не ставите объекты в массив. Вы просто перебираете массив, имеющий 5 нулей, создайте локальную переменную Panel p (которая указывает на null) и назначьте объект new Panel. После этого массива цикла все еще содержит 5 нулей.

Если вы не должны придерживаться массива, используйте список вместо:

List<Panel> panelList = new ArrayList<>(5); //Java7 diamond operator 
panelList.add(new Panel()); 
panelList.add(new Panel()); 
panelList.add(new Panel()); 
panelList.add(new Panel()); 
panelList.add(new Panel()); 

Конечно, это не самый изящный способ, но вы не получите NPE.

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