简单java程序中的意外结果

简单java程序中的意外结果,java,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

我是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。我假设您在“按键”之间按enter键?在大多数系统上,直到输入收到换行符,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);
    }
}

我感觉您的问题在于缓冲I/O。我假设您在“按键”之间按enter键?在大多数系统上,直到输入收到换行符,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);

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

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

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

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

请参阅输入流中读取方法的说明。在内部,它会打2个电话。如果第一个调用导致IOException,它将再次进行另一个调用,该调用返回IOException。。然后它将被视为文件的结尾


请参见输入流中读取方法的说明。在内部,它会打2个电话。如果第一个调用导致IOException,它将再次进行另一个调用,该调用返回IOException。。然后它将被视为文件的结尾


您按哪个键?
System.in.read()
做什么?我猜那是
int java.io.InputStream.read()
?无法复制:你是在按一个键然后进入吗?你按哪个键?
System.in.read()
做什么?我猜那是
int java.io.InputStream.read()
?无法复制:你是在按一个键然后进入吗?谢谢。。。我想我发现了问题。。。它获取另一个ascii值为10的输入。我想这是回车键。这就是它如何获得两个输入。@Karthik.Venkata这是新行的ASCII码,请参阅我的答案以获得实际解释。这是因为Java在读取stdin时使用了缓冲I/O。谢谢。。。我想我发现了问题。。。它获取另一个ascii值为10的输入。我想这是回车键。这就是它如何获得两个输入。@Karthik.Venkata这是新行的ASCII码,请参阅我的答案以获得实际解释。这是因为Java在读取stdin时使用了缓冲I/O。