2014-11-17 2 views
-1

이 메서드는 작동해야한다고 생각하지만 remove 메서드를 사용하려고 할 때 nullpointer 예외가 계속 발생합니다.두 문자열을 비교하는 동안 NullPointerException이 발생했습니다.

힙에 8 가지를 추가 한 다음 remove() 메서드를 사용하여 하나씩 차례로 인쇄하십시오. 두 번째 하나는 null 포인터 예외가 발생할 때마다,하지만 난 왜 몰라? 그래서, 나는 for 루프에서 System.out.println(example.remove());을 시도했지만, 한 가지만 출력하면 null 포인터 예외가 생깁니다. 내 IDE는 null 포인터가 제거에서 나온 다음 percolate에서 나온 다음 비교에서 시작한다고 말합니다.

이 문제를 어떻게 해결할 수 있습니까?

public class GenericHeap<E> { 
    private int size; 
    int capacity = 10; 
    public E[] heap; 
    Comparator mycomparator; 

    public GenericHeap(Comparator c) { 
     this.size = 0; 
     heap = (E[]) new Object[capacity]; 
     mycomparator = c; 
    } 

    public E remove() { 
     E returnval = heap[1]; 
     heap[1] = heap[size]; 
     size--; 
     this.pop(); 
     this.percolatedown(1); 
     return returnval; 
    } 

    private void pop() { 
     E[] temp = (E[]) new Object[capacity]; 
     System.arraycopy(heap, 0, temp, 0, size); 
     heap = temp; 
    } 

    private void percolatedown(int i) { 
     while (i * 2 <= size) { 
      int kid = minchild(i); 
      if (mycomparator.compare(this.heap[i], this.heap[kid]) == 1) { 
       E temp = this.heap[i]; 
       this.heap[i] = this.heap[kid]; 
       this.heap[kid] = temp; 
      } 
      i = kid; 
     } 
    } 

    private int minchild(int i) { 
     if ((i * 2) + 1 >= size) { 
      return i * 2; 
     } else { 
      if (mycomparator.compare(heap[i * 2], heap[(i * 2) + 1]) == -1) { 
       return i * 2; 
      } else if (mycomparator.compare(heap[i * 2], heap[(i * 2) + 1]) >0) { 
       return i * 2 + 1; 
      } 
     } 
     return i*2; 
    } 
} 

비교기 클래스 :

public class StringComparator implements Comparator <String> { 

    @Override 
    public int compare(String t, String t1) { 
     if (t.length() > t1.length()) { // null pointer here 
      return 1; 
     } else if (t.length()<t1.length()){ 
      return -1; 
     } 

     if (t.compareTo(t1)<0) { 
      return 1; 
     } 
     if(t1.compareTo(t1)>0) { 
      return -1; 
     } 
     return 0; 
    } 
} 

나는이 예외 얻을 :

Exception in thread "main" java.lang.NullPointerException 
    at hw10.StringComparator.compare(StringComparator.java:10) 
    at hw10.StringComparator.compare(StringComparator.java:6) 
    at hw10.GenericHeap.percolatedown(GenericHeap.java:82) 
    at hw10.GenericHeap.remove(GenericHeap.java:53) 
    at hw10.Tester.main(Tester.java:62) 

자바 결과 : (에서 System.out.println : 1

+0

* nullpointer 예외 * :

이 시도? 스택 추적을 추가하고 NPE가 발생하는 행을 가리 키십시오. – A4L

+0

생성자에 전달할 'mycomparator'의 구현을 표시 할 수 있습니까? – A4L

+0

예, 저는이 사이트를 처음 접해 보았습니다. 특정 줄을 어떻게 가리키고 있습니까? 내가 넣고있는 대부분의 것들이 형식을 엉망으로 만들고 있기 때문에 어떤 키를 사용해야합니까? – tokola

답변

1

당신이 시도 example.remove()); for 루프에서는 첫 번째 예제의 결과 만 가져오고 두 번째 예제의 경우 NullPponterException은 두 번째 예제가 null임을 의미합니다. 한 줄에

List<GenericHeap> genericHeapList = new ArrayList<GenericHeap>(...) 
for(GenericHeap example : genericHeapList){ 
    if(example != null){ 
     System.out.println(example.remove()); 
    } 
} 
관련 문제