简单的java程序出乎意料的结果

时间:2014-04-07 20:24:52

标签: java

我是java的新手,我的问题是按下一个键后输出显示2个数字,我无法理解为什么。

这是代码:

class ForTest {    
    public static void main(String args[]) throws java.io.IOException {
        int i;
        System.out.println("Press S to stop.");
        for(i = 0; (char) System.in.read() != 'S'; i++)
            System.out.println("Pass #" + i);
    }
}

4 个答案:

答案 0 :(得分:1)

我觉得你的问题是缓冲的I / O.我假设你的“按键”之间你正在进入?在大多数系统上,I / O在输入收到换行符之前不会刷新。这个问题是缓冲区中有一个换行符,它会计入循环中的字符数。

编辑:

如果情况确实如此,您似乎希望在您点击仅包含“S”的行之前,您的“通行证”是行数。如果是这样,请尝试使用以下内容:

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

class ForTest {
    public static void main(String args[]) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int i;
        System.out.println("Press S to stop.");
        for(i = 0; !br.readLine().equals("S"); i++)
            System.out.println("Pass #" + i);
    }
}

答案 1 :(得分:1)

虽然我无法重现问题:(See Here),我的建议是打印出字符(作为整数)。这将有助于您调试:

for(i = 0; (char)( int c = System.in.read() ) != 'S'; i++)
   System.out.println("Pass #" + i + ": " + c);

答案 2 :(得分:1)

我测试了你的程序,我想我看到了问题,如果仔细观察,你会发现,当你按下两次按键时,你有3个输出,当你按下三次按键时,你有4个输出等。 问题是System.in.read()确实将换行计为一个字符,因此您总会有一个输出。

答案 3 :(得分:1)

请参阅输入流中的read方法说明。在内部,它可以进行2次通话。如果第一次调用导致IOException,它将再次进行另一次调用,如果返回IOException ..那么它将被视为文件结束。

http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html