2014-04-07 2 views
1

이 오류가 계속 발생합니다. 이제는 SortSearchUtil에 대한 정보를 얻었습니다. 일부 디버깅을 시도했지만 문제를 해결할 수 있습니다. 이 오류는 읽 일종의 선택의NullPointerException 문제가 발생했습니다.

----jGRASP exec: java PostOffice 
Exception in thread "main" java.lang.NullPointerException 
    at SortSearchUtil.selectionSort(SortSearchUtil.java:106) 
    at PostOffice.sortLetters(PostOffice.java:73) 
    at PostOffice.main(PostOffice.java:15) 

----jGRASP wedge: exit code for process is 1. 
----jGRASP: operation complete. 

라인 (106) : 내 방법으로 잘못 될 수 모르겠어요

if (array[indexSmallest].compareTo(array[curPos]) > 0) 

합니다. 강사가 저에게 준 표준 방법입니다. 내 프로그램을 디버깅하려고했지만 꽤 붙어있다. 여기에 오류가 선택 정렬,에서 발생되는 방법은 다음과 같습니다

public static void selectionSort(Comparable[] array) 
    { 
     int curPos, indexSmallest, start; 
     Comparable temp; 
     for (start = 0; start < array.length - 1; start++) 
     { 
     indexSmallest = start; 
     for (curPos = start + 1; curPos < array.length; curPos++) 
      if (array[indexSmallest].compareTo(array[curPos]) > 0) 
      { 
       indexSmallest = curPos; 
      } 
      // end for 
     temp = array[start]; 
     array[start] = array[indexSmallest]; 
     array[indexSmallest] = temp; 
     } // end for  
    } 

정렬 방법이 우체국 방법의 SortSearchUtil.selectionSort를 호출 하단에 :

import java.util.*; 
import java.io.*; 

public class PostOffice 
{ 

    private final int max = 1000; 
    private Letter [] ltrAra = new Letter[max]; 
    private int count; 

    public static void main(String [] args) 
    { 
     PostOffice postOffice = new PostOffice(); 
     postOffice.readLetters("letters.in"); 
     postOffice.sortLetters(); 
     postOffice.printLetters(); 
    } 

    public PostOffice() 
    { 
     Letter [] Letters = ltrAra; 
     this.count = 0; 
    } 

    public void readLetters(String filename) 
    { 
     int count = 0; 
     int iWork = 0; 

     Scanner fin = new Scanner(filename); 

     String toName, toStreet, toCity, toState, toZip; 
     String fromName, fromStreet, fromCity, fromState, fromZip, temp; 
     double weight; 
     String sWork; 
     fin = FileUtil.openInputFile(filename); 
     if (fin != null) 
     { 
     while (fin.hasNext()) 
     { 
      toName = fin.nextLine(); 
      toStreet = fin.nextLine(); 
      sWork = fin.nextLine(); 
      iWork = sWork.indexOf(","); 
      toCity = sWork.substring(0, iWork); 
      iWork = iWork + 2; 
      toState = sWork.substring(iWork, iWork + 2); 
      iWork = iWork + 3; 
      toZip = sWork.substring(iWork); 

      fromName = fin.nextLine(); 
      fromStreet = fin.nextLine(); 
      sWork = fin.nextLine(); 
      iWork = sWork.indexOf(","); 
      fromCity = sWork.substring(0, iWork); 
      iWork = iWork + 2; 
      fromState = sWork.substring(iWork, iWork + 2); 
      iWork = iWork + 3; 
      fromZip = sWork.substring(iWork); 

      sWork = fin.nextLine(); 
      weight = Double.parseDouble(sWork); 

      ltrAra[count] = new Letter(toName, toStreet, toCity, toState, toZip, fromName, fromStreet, fromCity, fromState, fromZip, weight);  
      count++; 
      } 
      fin.close(); 
     } 
    } 

    public void sortLetters() 
    { 
    SortSearchUtil.selectionSort(ltrAra); 
    } 

    public void printLetters() 
    { 
     for (Letter ltr : ltrAra) 
     { 
     System.out.println(ltr); 
     System.out.println(); 
     } 
    } 
} 

내 파일은 다음과 같습니다 "letters.in"분명히

Stu Steiner 
123 Slacker Lane 
Slackerville, IL 09035 
Tom Capaul 
999 Computer Nerd Court 
Dweebsville, NC 28804-1359 
0.50 
Tom Capaul 
999 Computer Nerd Court 
Dweebsville, NC 28804-1359 
Chris Peters 
123 Some St. 
Anytown, CA 92111-0389 
1.55 
+2

** SortSearchUtil.java ** 파일에 # ** 106 ** 행을 표시하십시오. –

+0

클래스에 다음 행이 있습니다. private letter [] ltrAra = new Letter [max]; –

+0

그래서 생성자에서이 줄이 필요하지 않습니다. Letter [] Letters = ltrAra; –

답변

2

당신은 NPE를 얻을 수 있기 때문에 :

ltrAra을 1000 개의 항목으로 초기화하지만 방법 readLetters()에서 1000 개 미만의 항목을 읽었습니다. 따라서이 배열의 끝에서 일부 null 참조는 초기화되지 않은 채로 남아 있습니다 (배열 작성 자체가 단일 항목을 모든 객체로 설정하지 않음을 기억하십시오). 그러므로 다음의 sorting-method는 Null 참조를 얻는다.

제안 된 해결 : 그 자동으로 인해 내부 범위 체크에 너무 많은 항목에 액세스하지 못할 것이기 때문에

당신은 배열 대신 ArrayList을 사용해야합니다.

+0

나는 그것을 할 것이지만 그것은 할당을위한 것이고 우리는 배열을 사용해야한다. 생각해 줘서 고마워! – user3500131

+0

@ user3500131 글쎄, 당신은 언제든지 배열로 목록을 변환 할 수 있습니다. 내부적으로 나는 목록을 사용하고 배열을 기대하며 사용자가 제어 할 수없는 다른 독점 인터페이스를 공급하기 위해이 목록을 변환합니다. –

+0

SortSearchUtil.selectionSort (ltrAra);를 호출하는 동안이 작업을 수행 할 수 있습니까? – user3500131

2

Meno가 잘 설명한 위의 답변 외에도 Null 포인터 예외가 발생할 때를 이해해야합니다.

당신의 오류 라인 : 우리는이 라인에서 NPE를 받으면 if (array[indexSmallest].compareTo(array[curPos]) > 0)

, array[indexSmallest]null

입니다 그리고 당신은 null에 작업을 호출 할 때, 당신은 NPE을받을 것은 분명하다. 희망은 이것이 디버깅에 도움이되기를 바랍니다.

  • 또한, 주요 이유 중 하나는 우리는 우리가 배열의 길이를 모를 때 Arrays 이상 ArrayList이 선택할 때.

  • 하나 개 더 제안, 당신은 ArrayList을 만들고 각각의 클래스 T 변환, 배열로 모든 클래스의 ArrayList를 변환 할 Arrays

을 고수 할 경우 다음 Arrays로 변환 할 수 있습니다. 예 : 문자열 배열을 원한다면 T를 'String'으로 변환하십시오.

List<T> list = new ArrayList<T>(); 

T [] students = list.toArray(new T[list.size()]); 
관련 문제