我正在通过" Java初学者指南,第六版"作者:Herbert Schildt。
在Windows Powershell中使用Windows 7 Home Premium 64位和Java 1.8.0_73。
当我编译本练习时(没有编译器警告或错误):
class DoWhileDemo {
public static void main( String[] args )
throws java.io.IOException {
char ch;
do {
System.out.print( "Press a key followed by ENTER: " );
ch = (char) System.in.read();
} while( ch != 'q' );
}
}
当我使用' java DoWhileDemo'我得到了
Press a key followed by ENTER: f
Press a key followed by ENTER: Press a key followed by ENTER: Press a key followed by ENTER: q
程序按预期退出(当我点击' q'然后按ENTER键),但多次打印"按一个键然后按ENTER:"不是。
为什么会发生这种情况?
答案 0 :(得分:1)
声明
ch = (char) System.in.read();
读入单个字符。当用户按下q
和enter
时,会向您的代码发送三个字符:
q
\r
\n
在Windows系统上。因此,在输入队列中没有任何内容并且代码停止读取之前,您将再循环两次。
在Linux上,您只会看到一个额外的提示,因为在这种情况下只会发送两个字符(q\n
)。
如果你想处理整行(就像你看到的那样),你必须将System.in
包裹在BufferedReader
中,这样你才能调用readLine()
。
答案 1 :(得分:-1)
这是因为当您按f
表示它不等于q
时,条件为真,当您按q
条件变为false并循环退出时,循环执行一次又一次