无限循环

时间:2013-09-20 18:48:15

标签: java

我在这段代码中得到一个无限循环

我只是想让用户在while循环中重新输入一次整数

问题出在哪里?

System.out.print ("Enter a number: ");

while (!scan.hasNextInt())
  System.out.print ("reenter as integer: ");
  num = scan.nextInt();

4 个答案:

答案 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