我得到一个超出界限的数组异常。我知道它因为数组是空的但我在尝试使用其内容之前检查了长度。但它甚至不会进行检查,因为它说数组导致空指针异常。任何想法为什么抛出它?
这是代码
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;
}
答案 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,并将其移动到列表中的下一个单词。
兼容的单词会添加到图表中,并且不会添加不兼容的单词。