2014-04-27 2 views
-2

배열 예외가 발생합니다. 예외가 발생합니다. 나는 그 배열이 비어 있기 때문에 그것의 내용을 사용하려고 시도하기 전에 그 길이를 체크한다. 그러나 어레이가 null 포인터 예외를 발생시키는 이유 때문에 검사를 수행하지도 않습니다. 왜 그걸 던지는 사람?범위를 벗어나는 배열 및 null 포인터 예외

여기 여기에 코드를

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

[자바 초보자를위한이 디버깅 안내서] (http://keysersblog.wordpress.com/2014/04/21/debugging-java-code-a-beginners-guide/)에 관심이있을 수 있습니다. 사람들이 기본 디버깅을 시작하는 데 도움이되도록 작성했습니다. – keyser

+2

ArrayIndexOutOfBoundsException * 또는 *가 발생하거나 NullPointerException이 발생합니다. 둘 다받을 수는 없습니다. 그것은 당신이 예외를 얻고있는 곳을 우리에게 말하지 않았음에도 도움이되지 않습니다. 또한 코드가 급격하게 들여 쓰기에 도움이되지 않습니다. ( –

+0

둘 다 얻고 있습니다. wordResult 행에 ArrayIndexOutOfBounds가 나타납니다. = wordNet.getWordNetPath (groupList.get (i)) 그리고 (wordResult.length == 0이면) 줄에 nullPointer가 생깁니다. 들여 쓰기에 대해 죄송합니다. 코딩을 마친 후에는 모두 수정합니다. . 이상한 방법이지만 그것을하는 방법. – user3469624

답변

3

코드가 wordResult.length을 평가하려고 할 때 다음 문에서 NullPointerException을 야기 반환 null, wordNet.getWordNetPath(groupList.get(i));합니다. 당신은 우리가 경계 예외 밖으로 배열을 진단하는 스택 추적을 게시해야합니다

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

편집 : 제쳐두고, 당신이로 다시 작성하여 (인덱스 j에) 내부 루프 내부의 if을 제거 할 수

: 배열 범위 예외가이 라인에서 오는 것이 귀하의 의견을 바탕으로
wordResult = wordNet.getWordNetPath(groupList.get(i)); 

groupList.get(i)getWordNetPath에서 예외를 throw하는 일부 값을 반환하는 것으로 의심됩니다. 대답은 게시하지 않은 코드의 어딘가에 있습니다. 당신이 예외의 원인을 추적 귀찮게 할 단순히 프로그램이 발생되는 이벤트 일을 계속 할 수 있도록하지 않으려면, 당신은 단순히 그것을 잡을 수

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

당신은 또한 받고있는 경우 NullPointerExceptiongetWordNetPath에서 가끔 throw되는 경우 두 번째 catch 절을 추가 할 수 있습니다.

+0

if 문에 여분의 체크를 넣을 때 여전히 배열이 나올 수있는 상태를 커버해야하므로 NullPointerException이 발생합니다. – user3469624

+0

@ user3469624 - 내가 작성한'if' 테스트는 여전히 생성 중입니다. NPE. 아직도 같은 줄에서 오는 것이 확실합니까? 프로젝트를 올바르게 다시 빌드하고 업데이트 된 코드를 실행하고 있습니까? –

+0

groupList.get (i)가 사용하고있는 사전에서 찾을 수없는 반환 단어가 있다는 것을 알고 있습니다. 이것이 내가 겪고있는 문제의 원인입니다. 나는이 문제를 처리 할 때 시스템이 계속 실행될 수 있도록 이것을 처리하는 방법을 모른다. 이 코드를 원래 게시물에 추가합니다. – user3469624

0

알 수 있습니다. 전체 코드 블록에 try catch를 추가해야했습니다. 이것은 NullPointerException이 catch 된 사전에 포함되지 않은 단어를 의미하며 목록의 다음 단어로 이동합니다.

호환되는 단어가 그래프에 추가되고 호환되지 않는 단어가 추가되지 않습니다.