与无限循环混淆,涉及Scanner.nextInt();

时间:2015-08-17 03:33:30

标签: java loops input while-loop

我在理解代码无法正常工作时遇到问题。我的目标是继续阅读用户的输入,直到用户最终进入" 5",代码将继续。 我很欣赏可能有更好的方法,并且愿意采用更简洁的方法来解决这个问题(尝试解析一个字符串),但是我的问题更为好奇,为什么我的方法不起作用而不是寻找一种更好的方法。

当输入任何整数时,代码工作正常,但是如果我输入一个String,代码会连续循环,并且始终启动catch块而不需要任何输入。我认为扫描仪的一个功能是保留我的输入,但我不确定。

我的代码如下:

import java.util.Scanner;
import java.util.InputMismatchException;

public class App {
    public static void main(String[] args) {

        int temp = 0;
        System.out.println("Enter the number 5: ");

        while (temp != 5) {
            try {
                temp = sc.nextInt();
            } catch (InputMismatchException e) {
                System.out.println("Try again!");
            }
        }
        System.out.println("Got it!");
        sc.close();
    }
}

3 个答案:

答案 0 :(得分:2)

如果要读取的下一个不是整数,那么nextInt不会读取任何内容。因此,如果您输入“hi”,则nextInt会引发InputMismatchException,您的程序会再次调用nextInt那个调用仍会抛出一个InputMismatchException,因为接下来要读的东西仍然是“hi”,这不是一个整数。然后你的程序再次调用nextInt,并且出于同样的原因再次抛出异常。等等。

一种可能的解决方案是调用sc.next(),并忽略结果:

        try {
            temp = sc.nextInt();
        } catch (InputMismatchException e) {
            sc.next(); // ignore whatever the user typed that wasn't an integer
            System.out.println("Try again!");
        }

答案 1 :(得分:1)

正确的代码版本就是这样的。扫描仪不知道是否输入Int。让读取行并解析它并检查它是否为整数然后继续。

import java.util.Scanner;
import java.util.InputMismatchException;

public class App {
    public static void main(String[] args) {

        int temp = 0;
        System.out.println("Enter the number 5: ");
    Scanner sc = new Scanner(System.in);
        while (temp != 5) {
            try {
        String str = sc.nextLine();
                temp = Integer.parseInt(str);
            } catch (NumberFormatException e) {
                System.out.println("Try again!");
            }
        }
        System.out.println("Got it!");
        sc.close();
    }
}

答案 2 :(得分:0)

以下是我的想法:

  1. 输入int时,工作正常。 sc.nextInt();能够将输入解析为有效的整数值。
  2. 输入字符串时,sc.nextInt();会抛出异常,因为输入字符串不是有效的整数值。
  3. 现在在您的代码中,如果输入的值不是整数,则循环将永远不会中断,因为它始终为(temp != 5)始终为真,因此循环无限重复。