Java 不确定为什么我的for循环是';i don’我没有按我想的那样工作

Java 不确定为什么我的for循环是';i don’我没有按我想的那样工作,java,for-loop,Java,For Loop,所以,在我开始之前,我只想说我对Java作为一种语言非常陌生,我一直在阅读一本推荐给我的教科书。 关于for循环的教科书中提供的一个示例具有以下代码,这意味着在用户按下键盘上的字符“S”之前,将生成一个无限for循环 代码如下: class ForTest { public static void main(String args[]) throws java.io.IOException { int i; System.o

所以,在我开始之前,我只想说我对Java作为一种语言非常陌生,我一直在阅读一本推荐给我的教科书。
关于for循环的教科书中提供的一个示例具有以下代码,这意味着在用户按下键盘上的字符“S”之前,将生成一个无限for循环

代码如下:

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);
                
        }
}
我完全按照书中写的那样复制了代码,但是当我运行程序时,出乎意料的是,它没有开始在控制台上打印数字。此外,每当我按下键盘上的任何键,它都会在序列中生成三个数字。示例如下所示:

我还提供了以下书中代码的屏幕截图:

我想知道是否有人知道为什么会这样!
任何帮助都将不胜感激。

这段代码看起来像是由某个人编写的,他故意使它变得迟钝,让初学者难以理解

for
语句的中间表达式是执行循环下一步的标准。在循环的每个步骤之前都会对其进行评估,以确定for循环是否已完成。在这种情况下,它调用.read()中的
,并在循环的每个步骤之前检查输入是否为
S

in.read()
等待它获得的下一行输入。当您输入一个值并按enter键时,该行将被读取,因此循环将执行一个步骤。并且还输入了一个新行,因此循环进行第二步


除非您输入行,否则它不会将行打印到控制台,因为.read()中的
会导致程序阻止(等待)下一次输入。

它多次打印的原因是检测到多个字符。 在您的情况下,它会打印两次,因为您输入了一个值(pass1)和一个新行(pass2

您遇到的问题不是System.in.read(),而是因为控制台通常使用缓冲方法。这意味着只要按enter键,数据就只能传输到
系统.in.read()


因此,要使示例正常工作,您必须将控制台切换到非缓冲模式,但没有可移植的方法来实现这一点,因为控制台的类型太多了。也许可以看看这本书使用的是什么编辑器/控制台

与大多数Java介绍相比,这是一种奇怪的方法。考虑一个不同的教科书。“直到用户按下键盘上的字符”他们忘记添加“并按Enter”,它将不会打印数字除非你按下一个键,然后进入,但是为什么当我按下一个键以外的S让我们说A,它不继续无限打印?相反,它只是打印出3次IIN迭代,这意味着每次你按下一个键,你就会得到一个数字,直到你按下SHello,非常感谢你的解释,我对我的原始帖子进行了编辑,我意识到事实上,每当我输入一个键,它就会打印出3条语句。正如您所解释的,第一次迭代是针对输入的原始字符,第二步是针对“新行”?第三次迭代背后的原因是什么?
System.in.read()
一次读取一个字节的数据。对于您在控制台中键入的任何内容,字节数可能超过两个。新行可能是CRLF(两个字节)或简单LF(一个字节),具体取决于您运行的平台。非常感谢您的回答。我刚刚意识到我的输出实际上打印出了3次迭代,而不是2次迭代。(我举了一个例子)。你知道为什么要进行第三次迭代吗?这可能取决于你使用的系统。一些系统使用´\n´表示新行,其他系统使用´\r\n´。我已经在我的系统上测试了你的代码,一个字符只返回两行+换行符好的,谢谢,这就解释了它!尽管如@Jems所说,与大多数Java入门书相比,这是一种非常奇怪的方法。这本书被赫伯特·席尔德称为“Java:初学者指南”。我读了不少关于它的评论。你推荐其他的书吗?