文件结尾NullPointerException

我想要的是通过从命令行键入Ctrl + z并从控制台读取BufferedReader来达到EOF 。 以下代码执行此操作。 但问题是,它在到达EOF后发出NullPointerException 。 有没有办法跳过这个例外? 或者更准确地说,从控制台读取BufferedReader到达EOF的正确方法是什么?

 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; class EOF { public static void main(String args[]) { String s = ""; String EOF = "^z"; BufferedReader read = new BufferedReader(new InputStreamReader(System.in)); try { while (!s.equals(EOF)) { s = read.readLine(); } } catch (IOException e) {} } } 

或者更准确地说,从控制台读取bufferedReader到达EOF的正确方法是什么?

目前你实际上是在检测字符’^’和’z’,它不像’^’实际上是一个控制字符。

你得到的例外实际上暗示了你应该如何处理这个问题。 从BufferedReader.readLine的文档:

返回:
包含行内容的String,不包括任何行终止字符;如果已到达流的末尾,则为null

所以基本上你应该循环直到readLine返回null

 String line; while((line = read.readLine()) != null) { // Do something with line } 

了解调试器可以提供多少帮助:

在此处输入图像描述

ctrl + z后s !null.equals(EOF)值,因此你得到这个exception,因为它就像写!null.equals(EOF)

为什么

因为BufferedReader#readLine返回“如果已到达流的末尾,则返回null”

只需使用null作为EOF信号。

  while((s=read.readLine())!= null) { ..... } 
 BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); String str; while((str=input.readLine()) != null ) { // }