繁体   English   中英

简单的Java程序出现意外结果

[英]Unexpected result in simple java program

我是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);
    }
}

我觉得您的问题出在缓冲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);
    }
}

尽管我不能重现该问题:( 请参阅此处 ),但我的建议是也打印出字符(作为整数)。 这将帮助您调试:

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

我测试了您的程序,我想我看到了问题,如果仔细观察,您会发现当您执行两次按键时您有3个输出,当您进行三个按键时您就具有4个输出,等等。问题是System.in.read()换行符算作字符,因此您将始终有一个输出。

请参见Input stream中的read方法的描述。 内部产生2个呼叫。 如果第一个调用导致IOException,它将再次进行另一个调用,如果返回IOException ..,则它将被视为文件末尾。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM