有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java数组越界和空指针异常

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

这是密码

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

  1. # 1 楼答案

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

    兼容的单词将添加到图形中,不兼容的单词将不添加

  2. # 2 楼答案

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

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

    您必须发布堆栈跟踪,以便我们诊断数组越界异常。您发布的代码不应该生成该代码(尽管它可能来自您正在调用的某个方法)。{cd7}除了内部循环之外,您还可以通过重写

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

    如果有时也会从getWordNetPath抛出NullPointerException,那么也可以为此添加第二个catch子句