새 메서드 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);
}
두 경우 모두 NullPointerException이 발생합니까? –
실제로 null인지 디버그하고 확인 하시겠습니까? 또한 실제 스택 추적이 도움이 될 수 있습니다. – Taylor
아마도 마지막 노드에있는 것일 수 있습니다. 그 노드보다 큰 노드는 없습니다. NPE를 트리거하지 않을 헤드 세트 (n.right, before, set) – Keerthivasan