2013-09-07 4 views
-2

저는 Java에 익숙하지 않고 작은 학습 프로젝트에서 작업하고 있지만 막혔습니다. 나는 왜 for 루프가 MyApp.main (MyApp.java:26)에서 "main"java.lang.NullPointerException 스레드의 Exception을 생성하는지 알아 내려고하고있다. 아무도 내가 뭘 잘못 설명 할 수 있습니까? 나는 대단히 도움을 주셔서 감사합니다!Java For Loop 객체가있는 배열의 오류

// Create array of toddlers 
babyMikeyToddler[] toddlercollection = new babyMikeyToddler[4]; 

toddlercollection[0] =new babyMikeyToddler("Baby Mikey",10,2); 
toddlercollection[1] =new babyMikeyToddler("Baby Mikey",10,2); 
toddlercollection[2] =new babyMikeyToddler("Baby Mikey",10,2); 

for(int i =0; i < toddlercollection.length; i++) 
{ 
    System.out.println(toddlercollection[i].getName()); 
} 

    } 

} 
+8

'toddlercollection [3]'은 (는) null입니다. – jlordo

+0

저는 여기에 새로운데, 이것은 우리가 downvote해야하는 질문처럼 보입니다. 그럴까요? –

+0

@Nasser 아마도 그렇지 않습니다. 기본적인 오류이지만 질문은 합리적으로 명확하고 잘 설명됩니다. – chrylis

답변

5

루프가 toddlercollection [3]에 도달하며 (3은 배열 길이보다 작으므로) null입니다. 따라서 toddlercollection[i].getName()에 전화 할 때 nullgetName()을 호출하려고하는데 예외가 발생합니다.

+0

감사합니다. 너무 바보 같아! 나는 실제 삶에서 PHP 프로그래머이지만 훨씬 더 용서하고 배열 크기를 설정할 필요가 없다. – user2757868

+1

@ user2757868 당신이 무언가의 목록을 가지고 있지만 끝내려는 숫자를 모르는 경우 대신'List'를 사용하십시오; 안정리스트가 있고 랜덤 액세스가 필요하다면'ArrayList', 원소를 많이 추가하거나 제거하려면'LinkedList'를 사용하십시오. – chrylis

+0

@chrylis 고마워요! – user2757868

0

JacobM의 답변 외에도 toddlercollection.length은 배열에 할당 된 번호가 아니라 배열에있는 슬롯의 수를 나타냅니다.

당신에게 문제를 해결하거나 당신 배열에

babyMikeyToddler[] toddlercollection = new babyMikeyToddler[3]; 

만 3 슬롯을 할당하거나 모든 슬롯

toddlercollection[3] =new babyMikeyToddler("Baby Mikey",10,2); 

을 채우거나 채워진 슬롯 카운터를 가지고

그것을 사용하여 반복
int c = 0; 
toddlercollection[c++] =new babyMikeyToddler("Baby Mikey",10,2); 
toddlercollection[c++] =new babyMikeyToddler("Baby Mikey",10,2); 
toddlercollection[c++] =new babyMikeyToddler("Baby Mikey",10,2); 
for(int i =0; i < c; i++) { ... } 

이상은 List

List<babyMikeyToddler> toddlercollection = new ArrayList<>(); 
toddlercollection.add(new babyMikeyToddler("Baby Mikey",10,2)); 
toddlercollection.add(new babyMikeyToddler("Baby Mikey",10,2)); 
toddlercollection.add(new babyMikeyToddler("Baby Mikey",10,2)); 
for(int i =0; i < toddlercollection.size(); i++) { 
    System.out.println(toddlercollection[i].getName()); 
} 

// using enhanced for loop 
for(babyMikeyToddler elem : toddlercollection) { 
    System.out.println(elem.getName()); 
} 
0

먼저 Java 명명 규칙을 따르십시오. 그렇지 않으면 코드가 실제로 혼란 스럽습니다. 클래스 이름은 대문자 (예 : BabyMikeyToddler)로 시작해야하며 변수/함수 이름은 낙타의 경우 여야합니다 (예 : toddlerCollection).

NPE를 얻을 때마다 NULL 인 변수에 대한 연산을 수행하기 때문에 발생합니다. 귀하의 경우 루프를 사용하여 값을 인쇄하므로 값을 할당하는 데 사용하지 않는 이유는 무엇입니까? (toddlercollection 배열의 각 요소가 모두 동일한 데이터를 가짐). toddlercollection가 [3] 객체를 할당 널 (null)입니다 때문이 그래서 당신은 루프에 대한 귀하의 당신은 NPE을 받고

for(int i =0; i < toddlercollection.length; i++) 
{ 
    toddlercollection[i] =new babyMikeyToddler("Baby Mikey",10,2); 
} 

을 할 수 있습니다. 그러나 당신은 가치를 인쇄하려고합니다. 내가 위에 제안한 다른 것들은 항상 변수가 NULL로 작동하는지 확인합니다.

예 :

for(int i =0; i < toddlercollection.length; i++) 
    { 
     if(toddlercollection[i].getName() != null) 
     { 
      System.out.println(toddlercollection[i].getName()); 
     } 

    }