2013-10-22 2 views
0

새 메서드 TreeSet, set을 만드는 중입니다.이 메서드는 호출 된 TreeSet의 모든 값이 'before'매개 변수 요소보다 작습니다.Null 포인터 예외 재귀 메서드

내가 모든 올바른 순회를 얻을 수 있습니다 내가 디버깅, 인터넷 콩에 새 세트는 예외가 발생한다 전에 모든 값을 포함한다. 나는 단지 headSet(n.right,before,set) .. n.right ..이라고 부를 때 나는 왜 그것을 알아낼 수 없다. 그것은 부서진다. 그것이 깨지지 않으면 잘 작동 할 것입니다.

편집 : 나는 문제 라인, headSet(n.right,before,set)으로 프로그램을 실행하면 후 3 headSet() 방법은 스택 추적에있는 주요 재귀 도우미에서 호출합니다. 그 행을 주석 처리 할 때 잘못된 트리 순회 이외의 문제는 없습니다.

이 재귀 도우미를 트리거 방법이라는 주요 공공는 다음과 같습니다

루트가 호출 TreeSet의 첫 번째 노드입니다
public SortedSet<E> headSet(E before){ 
    SortedSet<E> set = new SearchTreeSet<E>(); 
    headSet(root, before, set); 
    return set; 
} 

.

주요 재귀 도우미 : 두 번째 재귀 함수는 비교하지 않는

private void headSet(Node n, E before, SortedSet<E> set) { 
    int comp = myCompare(n.data, before); 

    if (comp < 0){ //n.data is less than before 
    // add node n to the new set 
    if (n.data != null) { //It shouldn't be null but I just wanted to eliminate NPE sources 
     set.add(n.data); 
    } 
    // all nodes to the left are added automatically with a separate recursive function 
    headSet(n.left, set); 

    // test nodes to the right 

    //////////////The next statement forces a null pointer exception //////// 
    headSet(n.right, before, set); 
    } 
    // n.data is greater than or equal to 'before' 
    else { 

     // move to the left and retest 
     headSet(n.left, before, set); 
    } 
} 

, 그냥 '설정'새로운 정렬 된 트리 세트에

private void headSet(Node n, SortedSet<E> set){ 
    if (n.data != null){ // 'if statement' is to eliminate NPE sources, it normally shouldn't be null 
    set.add(n.data); 
    } 
    if (n.left != null) { headSet(n.left, set); } 
    if (n.right != null) { headSet(n.right, set); } 
} 

모든 노드 지점을를 해결 추가 : 감사합니다! 그게 .. 그걸 보지 못했다니 믿을 수가 없어.

if (n.left != null) { 
    headSet(n.left, set); 
} 

if (n.right != null) { 
    headSet(n.right, before, set); 
} 

그리고 무엇도

if (n.right != null) { 
    headSet(n.right, before, set); 
} 
+0

두 경우 모두 NullPointerException이 발생합니까? –

+0

실제로 null인지 디버그하고 확인 하시겠습니까? 또한 실제 스택 추적이 도움이 될 수 있습니다. – Taylor

+0

아마도 마지막 노드에있는 것일 수 있습니다. 그 노드보다 큰 노드는 없습니다. NPE를 트리거하지 않을 헤드 세트 (n.right, before, set) – Keerthivasan

답변

0

첫째, 난 당신이 SortedSet의와 계획 무엇을 달성하려고 생각하지 않는다 : 여기

내가 문제를 해결하기 위해 변경 무엇 . SortedSet에 객체를 추가하면 객체에 정의 된 compareTo 메소드에 따라 객체의 내부 순서가 정렬됩니다. 이제 가장 간단한 방법은 n.data 클래스에 Comparable을 구현하는 것입니다. 그렇게하면 myCompare 메소드에서 정의한 로직을 사용할 수 있습니다. 이제 SortedSet에 n.data를 임의의 순서로 추가하면 SortedSet은 자연 순서를 사용하여 n.data를 구성합니다. 프로그래밍 방식으로 주문을 유지하려면 목록을 사용하십시오. 이제 NPE를 제거한 다음 Set에 저장된 n.data를 인쇄하고 정렬 알고리즘이 작동했는지 여부를 확인하려고합니다. set은 자연스럽게 객체 목록을 반환하기 때문에 수행 할 수 없습니다. 정렬 순서.