为什么在使用文本输入而不是用户输入时会出现NullPointerException?

时间:2011-09-21 02:54:38

标签: java

所以我必须编写一个航班预订系统的程序。如果我正常运行程序并在提示时输入值,则没有任何问题,但是当我使用.txt文件输入时,我得到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("")) {”行

输入文本如下:

First
WAAW
2
Economy
WCAACW
3

...

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

5 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

这两个表现不一样,因为(我认为)你从键盘输入“Q”,但你没有在输入文件中加上“Q”。

注意:我不是说你应该在文件中加上“Q”;您应该在代码中检查null

答案 2 :(得分:1)

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

此外,您可能希望在循环中声明input = new BufferedReader(new InputStreamReader(System.in));,这样您就不会在每次循环迭代时重新初始化读者。

! -

答案 3 :(得分:0)

readLine()方法在文件末尾返回null。这与你在输入时获得的“”不同。

http://download.oracle.com/javase/6/docs/api/java/io/BufferedReader.html#readLine()

您可以将测试更改为if (className == null || className.equals("")) { ...

答案 4 :(得分:0)

如果您想在遇到空字符串(“”)时停止创建飞机,那么您的文件中将需要一个空行:空行表示两行之间没有任何内容的行分隔符。如果你的意思是读到文件的末尾,你应该在看到null时停止,正如其他海报所说的那样。