数组超出范围和空指针异常

时间:2014-04-27 17:46:23

标签: java arrays exception

我得到一个超出界限的数组异常。我知道它因为数组是空的但我在尝试使用其内容之前检查了长度。但它甚至不会进行检查,因为它说数组导致空指针异常。任何想法为什么抛出它?

这是代码

 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 个答案:

答案 0 :(得分:3)

如果wordNet.getWordNetPath(groupList.get(i));返回null,那么当代码尝试评估NullPointerException时,这会在下一个语句中导致wordResult.length。您应该将if更改为:

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

您必须为我们发布堆栈跟踪以诊断数组越界异常。您发布的代码不应该生成(尽管它可能来自您正在调用的方法之一)。顺便说一句,您可以通过将其重写为:

来消除内部循环中的if(在索引j上)
for(int j=0; j<wordResult.length - 1; j++) {
    graph.addEdge(edgeFactory.create(), wordResult[j], wordResult[j+1]);
}

编辑:根据你的评论,数组边界异常来自这一行:

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条款。

答案 1 :(得分:0)

知道了。必须在整个代码块周围添加try catch。这意味着对于未包含在字典中的单词,将捕获NullPointerException,并将其移动到列表中的下一个单词。

兼容的单词会添加到图表中,并且不会添加不兼容的单词。