2013-07-29 2 views
1

Проблема, с которой я столкнулась, заставила меня порвать волосы уже несколько дней. Как вы можете видеть, я помещаю printlns туда, чтобы я мог проверить, где происходит ошибка. После просмотра данных в моей таблице исключение nullpointer происходит после последней части данных. Почему мой код не останавливает его от цикла в другой раз?NullpointerException Массив и объекты

public void prepare(int sheet, Students [] gradeSpecific, Students [] mcl) 
     { 
      String [] useableCandidates; 
      useableCandidates = new String [200];//school never has more than 40 candidates therefore 200 is more than enough 


     int i= 0; 



     if(sheet==1) 
     { 
      while(!gradeSpecific[i].getFirst_name().equals(null) && !gradeSpecific[i].getSurname().equals(null)) 
      { 
       if(useableCandidates[i]==null) 
       {useableCandidates[i]= new String();} 

       System.out.println(gradeSpecific[i].getFirst_name()+gradeSpecific[i].getSurname()); 
       useableCandidates[i]= gradeSpecific[i].getFirst_name()+" , "+gradeSpecific[i].getSurname(); 
       System.out.println(useableCandidates[i]); 
       i++; 
      } 
     } 
     else 
     { 
      while(!mcl[i].getFirst_name().equals(null) || !mcl[i].getSurname().equals(null)) 
      { 
        useableCandidates[i]= mcl[i].getFirst_name()+" , "+mcl[i].getSurname(); 
        i++; 
      } 
     } 



    } 
+1

какая линия выбрасывает NPE? и '! mcl [i] .getSurname(). equals (null)' 'Object' никогда не' null', его ссылка так использует '==' –

+1

Вы уверены, что 'mcl' никогда не' null'? –

ответ

4

Прежде всего, вы используете логический оператор OR ||, что означает, что любой из них может быть пустым, и в то время как все еще может оценить заявление. Вы должны использовать AND &&, чтобы убедиться, что у вас нет ни одного. Во-вторых, почему бы вам не использовать для этого простой цикл?

for (; mcl[i].getFirst_name() != null && mcl[i].getSurname() != null && i < mcl.Length(); i++) 
{ 
    useableCandidates[i]= mcl[i].getFirst_name()+" , "+mcl[i].getSurname(); 
} 

Конечно, если mcl[i] не существует для указанного i, это вызовет ArrayOutOfBoundsException. Важно также проверить это условие.

+0

Обратите внимание, что for-loop не нужно инициализировать 'int i', потому что это уже было инициализировано в коде. – bas

1

Эти условия:

while(!mcl[i].getFirst_name().equals(null)) 

даст NullPointerException, когда mcl[i].getFirst_name() возвращает нулевое значение. Измените его на:

while (mcl[i].getFirst_name() != null && mcl[i].getSurname() != null) 
Смежные вопросы