2011-09-21 2 views
1

비행 예약 시스템 인 프로그램을 작성해야합니다. 프로그램을 정상적으로 실행하고 메시지가 표시 될 때 값을 입력하면 아무 일도 일어나지 않지만 .txt 파일 입력을 사용하면 NullPointerException이 표시됩니다. 정상 입력을 수행 할 때 NullPointerException 점점 코드 메신저의 일부가사용자 입력이 아닌 텍스트 입력을 사용할 때 NullPointerException이 발생하는 이유는 무엇입니까?

public void instantiateAirplane() throws IOException{ 
     boolean creatingAirplane = true; 
     String className= ""; 
     String seatFormat; 
     int rowNums; 
     while (creatingAirplane){ 
      input = new BufferedReader(new InputStreamReader(System.in)); 
      System.out.println("Enter service class name or [ENTER] to finish: "); 

      className = input.readLine(); 
      if (className.equals("")) { 
       creatingAirplane = false; 
      } 
      else{ 
       System.out.println("Enter seating pattern: "); 
       seatFormat = input.readLine(); 
       System.out.println("Enter number of rows: "); 
       rowNums = Integer.parseInt(input.readLine()); 
       plane.creatSeatingChart(className, rowNums, seatFormat); 
      } 
     } 
    } 

, 그것은 다음과 같이 실행합니다 .txt 인 입력을 사용하는 경우 때

C:\Users\Owner\Desktop\Math&CIS\CS151\HW1>java UserInterface planes 
Enter service class name or [ENTER] to finish: 
First Class 
Enter seating pattern: 
WAAW 
Enter number of rows: 
2 
Enter service class name or [ENTER] to finish: 
Business Class 
Enter seating pattern: 
WAAW 
Enter number of rows: 
2 
Enter service class name or [ENTER] to finish: 

Add [P]assenger, Add [G]roup, [C]ancel Reservations, Print [S]eating chart, Prin 
t [M]anifest, [Q]uit 

하지만, 다음은

C:\Users\Owner\Desktop\Math&CIS\CS151\HW1>java UserInterface planes < input.txt 
Enter service class name or [ENTER] to finish: 
Enter seating pattern: 
Enter number of rows: 
Enter service class name or [ENTER] to finish: 
Exception in thread "main" java.lang.NullPointerException 
     at UserInterface.instantiateAirplane(UserInterface.java:21) 
     at UserInterface.main(UserInterface.java:123) 

C:\Users\Owner\Desktop\Math&CIS\CS151\HW1> 
를 발생

"if (className.equals("")) {"

t에서 예외가 발생합니다. 그는 입력 텍스트는 follwing을은 다음과 같습니다

First 
WAAW 
2 
Economy 
WCAACW 
3 

... 

I는 입력 텍스트를 사용할 때 작동하지 않는 이유를 모르겠어요.

+0

'UserInterface.java'에서'if (className.equals ("")) {'this'line 21' 코드를 확인할 수 있습니까? –

답변

1

iterator가 EOF 또는 파일 끝으로 도달하면 readLine() 메서드는 null을 반환합니다. 확인하려면 ClassName == null || className.Equal("")...

input = new BufferedReader(new InputStreamReader(System.in)); 또한 루프 반복을 선언하면 각 루프 반복마다 독자를 다시 초기화하지 않을 수도 있습니다.

-!

+0

그 두 번째 팁 주셔서 감사. 그게 문제 였어.방금 입력이 선언 된 곳을 인스턴스화하고 다른 인스턴스를 모두 삭제하고 문제가 해결되었습니다. 감사! – Wonger

+0

도와 줘서 기쁘다. 악취에 빠져있다! – Aziz

1

readLine을 사용하여 파일에서 연속적인 행을 읽을 때 파일 끝을 읽으면 null이 반환됩니다.

1

readLine "스트림의 끝에 도달하면 null"을 반환합니다.

키보드에서 "Q"를 입력했지만 입력 파일에 "Q"를 입력하지 않았기 때문에이 두 가지 방식이 다르게 작동합니다.

참고 : 파일에 "Q"를 삽입해야한다는 것은 아닙니다. 코드에서 null을 확인해야합니다.

+0

의견을 보내 주셔서 감사합니다. 그러나 스트림의 끝까지 도달하지 못하는 문제가 있습니다. 2 행을 읽어 들이고 나서 null를 돌려줍니다. 그것은 doesnt "경제"에 도착하고, 그것 앞에 던져 예외는 – Wonger

0

에 테스트를 바꿀 수

, 다음 파일은에 빈 줄이 필요합니다 : 빈 줄은 두 줄 사이의 구분 기호를 의미한다. 대신 파일의 끝까지 읽으려는 경우 다른 게시자와 마찬가지로 null이 표시되면 중지해야합니다.

관련 문제