【问题标题】:Array out of bounds and null pointer exceptions数组越界和空指针异常
【发布时间】:2014-04-27 17:46:22
【问题描述】:

我得到一个数组越界异常。我知道它是因为数组是空的,但在尝试使用它的内容之前我会检查长度。但它甚至不会进行检查,因为它说数组导致空指针异常。有人知道为什么要扔这个吗?

这是代码

 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;
    }

【问题讨论】:

  • 您可能对this debugging tutorial for java beginners 感兴趣。我写它是为了帮助人们开始基本的调试。
  • 要么你得到一个 ArrayIndexOutOfBoundsException 要么你得到一个 NullPointerException。你不可能两者兼得。您没有告诉我们您在哪里得到异常并没有帮助 - 而且您的代码缩进也无济于事:(
  • 我都得到了。我在 wordResult = wordNet.getWordNetPath(groupList.get(i)) 行上得到 ArrayIndexOutOfBounds,在 if(wordResult.length==0) 行上得到 nullPointer。对缩进感到抱歉......我在完成编码后将其全部修复.. 奇怪的方法,但它就是我这样做的方式
  • @user3469624 实际上,您并没有得到两者,因为程序执行在第一个异常处停止。您是指不同的数据吗?
  • 我在不同的时间得到这两个。有时它停在第一行,有时停在我提到的第二行。这就是为什么我很困惑...

标签: java arrays exception


【解决方案1】:

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

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

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

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 子句。

【讨论】:

  • 当我在 if 语句中进行额外检查时,我仍然得到 NullPointerException,这让我感到困惑,因为这应该涵盖这个数组可能处于的状态
  • @user3469624 - 我写的if 测试不可能仍在生成 NPE。你确定它仍然来自同一条线路吗?您确定您正确地重建了项目并正在运行更新的代码吗?
  • 我知道 groupList.get(i) 返回的某些单词在我正在使用的字典中找不到,这就是导致我遇到问题的原因。我只是不知道如何处理这个问题,以便系统在发生这种情况时可以继续执行。我现在将其背后的代码添加到我的原始帖子中。
  • @user3469624 - 我看不出在getWordNetPath 中究竟会在哪里引发异常,但我在答案中添加了一些代码和一些解释,以显示当抛出异常。
  • 我已按照您的建议添加了 try catch 语句,当我检查 wordResults 的长度是否为 0 或代码中的 null 时,我仍然收到 NullPointerException。我已经对此进行了调试,并且在 getWordNetPath 方法中 wordResult 数组在返回之前为空,所以我不明白为什么会抛出这个异常。
【解决方案2】:

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

兼容的词被添加到图表中,不兼容的词不被添加。

【讨论】:

    猜你喜欢
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-18
    相关资源
    最近更新 更多