Java 中的标准输入为空
Null in standard input in Java
我正在开发一个小程序,用户可以在其中输入标准输入的文本,然后 return 以正确的对齐方式编辑此文本。
逐行读取输入的主要代码块:
public static void main(String[] args) {
try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
for (String nextLine, line = br.readLine(); line != null; line = nextLine) {
nextLine = br.readLine();
// Work with "line"
}
}
catch (IOException ex) {
System.exit(-1);
}
}
但输入永远不会全部读取。总是缺少最后一行并且 line
永远不会是 null
。经过少量调试后,我发现 nextLine = br.readLine();
行上的 br.readLine()
没有 return 任何东西(字面上它没有 return 任何东西。虽然没有抛出异常。)和程序保持 运行 但不执行我的代码的任何其他行。我也试过从文件中读取,但没有出现这个问题。
当您的输入来自标准输入时,您必须让您的程序知道输入何时结束。否则会一直等待下一次输入。
因此,您应该决定一些标记输入结束的字符或字符串。
例如,在这里键入 done
将结束循环:
public static void main(String[] args) {
try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
for (String nextLine, line = br.readLine(); line != null && !line.equals("done"); line = nextLine) {
nextLine = br.readLine();
// Work with "line"
}
}
catch (IOException ex) {
System.exit(-1);
}
}
这可能是因为 readLine()
阻塞,直到新行可用或流到达 EOF
(当您从 System.in
读取时永远不会发生)。
你永远不会得到最后的输入,因为你的循环总是处理先前读取的行。
试试这个:
for (String line; (line = br.readLine()) != null;)
并在您阅读完所有需要的输入后退出此循环,例如:
if(line.equals("finish")){
break;
}
我正在开发一个小程序,用户可以在其中输入标准输入的文本,然后 return 以正确的对齐方式编辑此文本。
逐行读取输入的主要代码块:
public static void main(String[] args) {
try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
for (String nextLine, line = br.readLine(); line != null; line = nextLine) {
nextLine = br.readLine();
// Work with "line"
}
}
catch (IOException ex) {
System.exit(-1);
}
}
但输入永远不会全部读取。总是缺少最后一行并且 line
永远不会是 null
。经过少量调试后,我发现 nextLine = br.readLine();
行上的 br.readLine()
没有 return 任何东西(字面上它没有 return 任何东西。虽然没有抛出异常。)和程序保持 运行 但不执行我的代码的任何其他行。我也试过从文件中读取,但没有出现这个问题。
当您的输入来自标准输入时,您必须让您的程序知道输入何时结束。否则会一直等待下一次输入。
因此,您应该决定一些标记输入结束的字符或字符串。
例如,在这里键入 done
将结束循环:
public static void main(String[] args) {
try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
for (String nextLine, line = br.readLine(); line != null && !line.equals("done"); line = nextLine) {
nextLine = br.readLine();
// Work with "line"
}
}
catch (IOException ex) {
System.exit(-1);
}
}
这可能是因为 readLine()
阻塞,直到新行可用或流到达 EOF
(当您从 System.in
读取时永远不会发生)。
你永远不会得到最后的输入,因为你的循环总是处理先前读取的行。
试试这个:
for (String line; (line = br.readLine()) != null;)
并在您阅读完所有需要的输入后退出此循环,例如:
if(line.equals("finish")){
break;
}