我在这段代码中得到一个无限循环
我只是想让用户在while循环中重新输入一次整数
问题出在哪里?
System.out.print ("Enter a number: ");
while (!scan.hasNextInt())
System.out.print ("reenter as integer: ");
num = scan.nextInt();
答案 0 :(得分:3)
你的while循环实际上并没有消耗它看到的内容。您需要使用非整数输入:
while (!scan.hasNextInt()) {
System.out.print ("reenter as integer: ");
scan.next(); // Consumes the scanner input indiscriminately (to a delimiter)
}
num = scan.nextInt(); // Consumes the scanner input as an int
答案 1 :(得分:3)
Scanner#hasNextInt()
方法不会将光标移过任何输入。因此,它将继续针对您提供的相同输入进行测试,因此如果失败一次将继续失败。因此,如果您输入"abc"
,那么hasNextInt()
将继续针对"abc"
进行测试,从而进入无限循环。
你需要在while循环中使用Scanner#next()
方法。
此外,您应该考虑使用一些最大限度的尝试来输入正确的输入,这样如果用户继续传递无效输入,则不会进入无限循环。
int maxTries = 3;
int count = 0;
while (!scan.hasNextInt()) {
if (++count == maxTries) {
// Maximum Attempt reached.
// throw some exception
}
System.out.print ("reenter as integer: ");
scan.next(); // Move cursor past current input
}
num = scan.nextInt();
答案 2 :(得分:0)
表达式“!scan.hasNextInt()”转换为“没有我可以扫描的另一个int”考虑循环“scan.hasNextInt()”,转换为“还有另一个我可以扫描的int “
答案 3 :(得分:0)
您没有大括号,因此while循环遍历System.out.print语句并且从不存在。
如果按原样添加大括号,则在输入非整数时读取int将失败。
要正确读取整数,您必须循环询问以获取下一个标记,然后验证它是否为int。
$cat Wt.java
import java.util.*;
class Wt {
public static void main( String ... args ) {
Scanner s = new Scanner(System.in);
System.out.print("Write a number: ");
while ( !s.hasNextInt()) {
System.out.print("Write a number: ");
s.next(); // <-- ask for the next and see if that was an int
}
int n = s.nextInt();
System.out.println("The number was: " + n );
}
}
$javac Wt.java
$java Wt
Write a number: one
Write a number: two
Write a number: tres
Write a number: 1.1
Write a number: f
Write a number: 42
The number was: 42