我正在玩java,想做一个简单的while循环,直到用户按下ctrl+z。
我有这样的想法:
public static void main(String[] args) {
//declare vars
boolean isEvenResult;
int num;
//create objects
Scanner input = new Scanner(System.in);
EvenTester app = new EvenTester();
//input user number
System.out.print("Please enter a number: ");
num = input.nextInt();
while() {
//call methods
isEvenResult = app.isEven(num);
if(isEvenResult) {
System.out.printf("%d is even", num);
} else {
System.out.printf("%d is odd", num);
}
}//end while loop
}//end main
我试过了 while( input.hasNext() ) { ...
但是while循环中的代码不会执行。
7条答案
按热度按时间ua4mk5z41#
您需要实现键绑定。然后,您可以根据所按的键来决定退出。
q3aa05252#
truesoft的解决方案已经过时了。它不适用于asker的原因有点超出了程序的范围。
这个程序适合我:我在linux下运行它,并在一行中输入ctrl-d。对于linux,ctrl-d是文件的结尾,就像对于windows,ctrl-z是一样的。程序完全停止运行。
windows控制台(黑色dos框,不管你怎么称呼它)有一个缺点:它逐行读取输入。在读取行之前,它不会看到ctrl-z,因此在看到ctrl-z之前,它需要一个回车键。
我不愿意启动windows只是为了尝试这个,但是我的猜测是ctrl-z后跟enter键(就像数字输入之后一样)应该会导致程序完全停止。
有一些system-y方法可以使java程序逐个字符地工作,这样您就可以直接处理任何字符并立即响应ctrl-z。但这是先进的东西,不属于像这样一个简单的编程练习。我认为ctrl-z/enter是一种可以接受的结束程序的方法。
voase2hg3#
这看起来像是deitel的书java how to program第9版中的练习6.16。
实际上,在windows平台上,ctrl-z字符结束输入,就像在大多数unix或linux平台上,ctrl-d结束输入一样。
此外,在程序的构造中也存在逻辑错误,这些错误表明扫描器方法和字节流中的系统(即来自控制台的标准输入)没有被很好地理解。
在您发布的程序中,声明:
无条件执行。它将阻止执行,直到收到某种输入。如果输入不是整数,它将抛出异常。如果接收到的输入是整数,那么num将被分配整数值,并且输入流(input)中的整数将从输入流中丢弃。输入行到行尾可能有剩余的内容,这取决于用户在按结束输入行并将其放入系统的enter键之前键入的内容。在扫描仪正在扫描的字节流中。
如果除了将input.hasnext()放入while语句的测试条件之外,程序保持编写状态,那么它将阻塞,直到nextint()处理的整数之后的输入流中有更多的输入。
一些答案建议使用键绑定作为解决方案。尽管这可能有效,但它几乎在硬件级别等待按键事件,对平台独立性不友好。这是一个潜在的兔子洞爱丽丝梦游仙境必须弄清楚各种各样的事件处理和代码必须知道它运行在什么平台上。使用hasnext()boolean false返回来指示输入流的结束应该在任何平台上工作,并将避免在几乎硬件事件级别处理键盘和按键的潜在不可移植的gee-whiz代码。
如果用户在windows平台上按ctrl-z键或在unix/linux平台上按ctrl-d键,而不必确定代码在哪个平台上执行,那么下面的程序将执行您(和练习)想要的操作并结束输入。
5ktev3wc4#
您在循环外执行输入,它将只运行一次。
将上述代码放入循环中。
因为你在循环中有一个系统,你也会知道控件是否进入了循环,显然它应该。
另外,试试看
我想知道while()是否单独工作。
v6ylcynt5#
如果您想循环直到用户必须通过ctrl+z强制中断,那么只需这样做
while(true)
. 但是你想要你的nextInt(
)在循环中,也许还有你的提示语句。bjp0bcyl6#
当用户写入非数字的内容时,循环中断。
ohfgkhjo7#
while(num!='z')
如果你期望一个“z”,为什么要做input.getint()?
你也许想看看
Console
上课也是。