2014-04-27 99 views
-2

我得到一個數組越界異常。我知道它是因爲數組是空的,但我在嘗試使用它的內容之前對長度進行了檢查。但它甚至不會執行檢查,因爲它說數組導致空指針異常。任何人有任何想法爲什麼把它扔掉?數組越界和空指針異常

下面的代碼

private void createGroupTree(ArrayList<String> groupList) throws JWNLException { 

    WordNetMeasures wordNet = new WordNetMeasures(); 
    String[] wordResult; 

    for(int i = 0; i<groupList.size(); i++) { 
     wordResult = wordNet.getWordNetPath(groupList.get(i)); 

    if(wordResult.length == 0) { 
     graph.addVertex(groupList.get(i)); 
    } else { 
     for(int j=0; j<wordResult.length; j++) { 
     if(j !=wordResult.length-1) { 
      graph.addEdge(edgeFactory.create(), wordResult[j], wordResult[j+1]); 
     } 
    } 
    } 

    }   
} 

這裏的getWordNetPath方法導致此問題的代碼。我知道列表中的一些單詞不在正在使用的字典中,我只是不知道如何處理來發出它的原因。

public String[] getWordNetPath(String word) throws JWNLException { 

     RiWordnet wordnet = new RiWordnet(); 
     //String wordOne = "dog"; 
     String[] posOfWord = wordnet.getPos(word); 
     int[]wordIds = wordnet.getSenseIds(word, posOfWord[0]); 
     String[] wordResults = wordnet.getHypernymTree(wordIds[0]); 

     return wordResults; 
    } 
+2

你可能會對[此java初學者的調試教程]感興趣(http://keysersblog.wordpress.com/2014/04/21/debugging-java-code-a-beginners-guide/)。我寫它幫助人們開始基本的調試。 – keyser

+2

要麼你得到一個ArrayIndexOutOfBoundsException *或*你得到一個NullPointerException。你不能同時獲得。這並沒有幫助,你沒有告訴我們你在哪裏得到的例外 - 它也不會幫助你的代碼是nastily縮進:( –

+0

我得到了兩個。我得到ArrayIndexOutOfBounds上線wordResult = wordNet.getWordNetPath(groupList.get(i)),並得到行上的nullPointer if(wordResult.length == 0)。對於縮進感到抱歉...一旦完成編碼,我就修復了這一切。 。奇怪的方法,但它只是我的方式 – user3469624

回答

3

如果wordNet.getWordNetPath(groupList.get(i));返回null,當代碼試圖評估wordResult.length,將在接下來的發言引起NullPointerException。你應該改變if到:

if(wordResult == null || wordResult.length == 0) { 
    graph.addVertex(groupList.get(i)); 
} else { 
    . . . 

你必須張貼堆棧跟蹤我們到陣列診斷出界異常。您發佈的代碼不應該生成該代碼(儘管它可能來自您正在調用的某個方法內)。

for(int j=0; j<wordResult.length - 1; j++) { 
    graph.addEdge(edgeFactory.create(), wordResult[j], wordResult[j+1]); 
} 

編輯:順便說一句,你可以通過重寫它作爲消除內環(上指數j)內if基於您的評論的數組邊界異常是從該行未來:

wordResult = wordNet.getWordNetPath(groupList.get(i)); 

我懷疑groupList.get(i)返回的值導致getWordNetPath拋出異常。答案在於你沒有發佈的代碼。如果你不希望打擾追蹤異常的來源,只是希望讓程序在事件之一,不斷被拋出,你可以簡單地抓住它:

try { 
    wordResult = wordNet.getWordNetPath(groupList.get(i)); 
} catch (IndexOutOfBoundsException e) { 
    wordResult = null; 
} 

如果你也越來越NullPointerException有時會從getWordNetPath中拋出,您也可以爲此添加第二個catch子句。

+0

當我把額外的支票放在if語句中時,我仍然得到NullPointerException,這讓我感到困惑,因爲這應該包括這個數組可能在 – user3469624

+0

@ user3469624中的狀態 - 我寫的'if'測試仍然是不可能的一個NPE。你確定它仍然來自同一條線?你確定你正確地重建了項目並且正在運行更新後的代碼嗎? –

+0

我知道有一些單詞groupList.get(i)返回在我正在使用的字典中找不到的,這是導致我遇到的問題的原因。我只是不知道如何處理這個問題,所以系統可以在發生這種情況時繼續執行。我將把這個代碼添加到我原來的帖子中。 – user3469624

0

明白了。必須在整個代碼塊中添加try catch。這意味着對於字典中未包含的單詞,將捕獲NullPointerException並將其移至列表中的下一個單詞。

兼容的詞被添加到圖中,不相容的詞不被添加。