2016-03-20 88 views
1

我正在运行一个循环来接受输入。奇怪的是,当我的缓冲区应该是空的时,我的程序似乎认为我有一个空字符。我写了一个小班来演示。Java输入缓冲区中的空字符持久性?

NullCharTest:

package Scratch; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 

public class NullCharTest { 

    public void testNullChar() throws IOException{ 

     for (int i = 0; i < 2; i++){ 

      String s = readString(); 
      while (s != null) { 
       s = readString(); 
      } 
      System.out.println(s); 
     } 
    } 

    private String readString() throws IOException { 
     BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 
     return in.readLine(); 
    } 

} 

主营:

package Scratch; 

import java.io.IOException; 

public class Main { 

    public static void main(String[] args) throws IOException{ 
     NullCharTest nct = new NullCharTest(); 
     nct.testNullChar(); 
    } 

} 

的输出是一样的东西:

q W¯¯ Ë 空 空 [编辑:输出只是空,nu正如Andreas指出的那样。]]

输入'e'后输入Ctrl + D。

为什么for循环没有在第二次运行时接受输入? s第二次不是空 - 它是一个新的String引用,它被要求引用一个readString()输出...所以大概我的程序应该在for循环的第二次运行时等待用户输入...

谢谢!

回答

0

这个代码是没有意义的:

String s = readString(); 
while (s != null) { 
    s = readString(); 
} 

通过while循环结束的时候,s为空,因为这是循环正常完成的唯一途径。

然后打印s的值,即打印值null

这是通过一个for循环迭代访问的2倍,这意味着它会总是端up打印null两次包围。

不输出q w e,而是输入您输入的内容。输出是nullnull。无论您在按Ctrl+D之前输入的内容如何,​​始终如一。

+0

为什么没有for循环采取投入运行,第二次? s不是第二次 - 它只是被要求做一个readString(),所以大概它应该等待用户输入...(作为编辑添加到问题中) –

+0

@学习...因为当你按下“Ctrl + D”,您将结束所有输入。你基本上关闭'System.in'。 – Andreas

0

修改它象下面这样:

String s = readString(); 
while (s != null) { 
    System.out.println(s); 
    s = readString(); 
}