2013-07-29 43 views
1

我現在面臨的問題是我把我的頭髮撕掉了好幾天了。正如你所看到的,我把printlns放在那裏,這樣我就可以檢查出錯的位置。在查看錶格中的數據之後,在最後一個數據段之後出現空指針異常。爲什麼我的代碼不會阻止它再次循環?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循環呢?

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循環不需要初始化'int i',因爲它已經在代碼中初始化了。 – bas

1

這些條件:

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

會給NullPointerException異常時mcl[i].getFirst_name()返回null。將其更改爲:

while (mcl[i].getFirst_name() != null && mcl[i].getSurname() != null)