2011-09-21 38 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); 
      } 
     } 
    } 

在做正常的输入,它运行像这样:

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 

但使用一个.txt输入时的时候,发生以下情况

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他输入的文字如下:

First 
WAAW 
2 
Economy 
WCAACW 
3 

... 

我不确定为什么它在使用输入文本时不起作用。

+0

你能否确认你的代码中有'if(className.equals(“”)){'这条语句在'UserInterface.java'的'21行'? –

回答

1

readLine()方法在迭代器达到所谓的EOF或文件末尾时返回null。检查是否ClassName == null || className.Equal("")...

另外,您可能希望在循环的外侧声明input = new BufferedReader(new InputStreamReader(System.in));,以便在每次循环迭代时不重新初始化读者。

- !

+0

感谢您的第二个提示。这就是问题所在。我刚刚声明了实例化输入,并删除了所有其他实例并解决了问题。谢谢! – Wonger

+0

很高兴帮助,被卡住臭! – Aziz

1

当您用readLine读取文件中的连续行时,如果读取文件末尾,则会返回空白。

1

readLine如果已到达流的末尾,则返回“null”。

这两者的行为不同,因为(我认为)你从键盘输入了“Q”,但是你没有在输入文件中输入“Q”。

注意:我并不是说你应该在文件中放置一个“Q”你应该在代码中检查null

+0

感谢您的评论。但是我遇到的问题并没有达到流的末尾。它读到“2”行后返回null。它不会达到“经济”,并在它之前抛出异常 – Wonger

0

,那么你的文件将需要一个空行:空行表示两行分隔符,它们之间没有任何内容。如果您的意思是读到文件末尾,您应该停下来看看null,正如其他海报所说。

相关问题