首页 > 解决方案 > 我的循环进入一个无限循环。我该如何解决?我不能在第二个循环中输入输入

问题描述

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

public class h {

    /** Test Function.
     * @param args Kommandozeilenparameter 
     */
    public static void main(String[] args) {

        Scanner scan = new Scanner(System.in);
        int input;
        boolean check = false;
        do {
            try {
                System.out.println("give me a number: ");

                input = scan.nextInt();

                check = true;
            } catch (InputMismatchException e) {
                System.out.println("Eingabe ist falsch");
            }
        } while (!check);
        System.out.println("getout");
    }
}

我正在尝试检查用户是否提供整数作为输入。我试图在 try catch 和 do while 循环的帮助下捕捉它。

但它进入了一个无限循环。

我该如何解决?

第二次我什么都写不出来。

标签: javaloopstry-catch

解决方案


当您有意外行为时,您应该首先去的地方是文档scan.nextInt()仅在可以将其转换为整数时才使用输入。否则,它将保留在扫描仪的缓冲数据中。因此,如果用户输入一个字母,则该字母永远不会被消耗,scan.nextInt()只是一遍又一遍地阅读同一个字母,并且因为它不是整数,所以它会一直循环。解决方法是简单地将扫描仪的输入读取为字符串,无论它是否可以解释为整数。然后你可以自己检查它是否是一个整数,并且输入已经被消耗掉了。这是您的示例,已修改:

Scanner scan = new Scanner(System.in);
int input;
boolean check = false;

do {
    try {
        System.out.println("give me a number: ");

        // This retrieves the next line of input, without converting it to an integer:
        String line = scan.nextLine();

        // This tries to convert it to an integer,
        // and throws a NumberFormatException if it can't:
        input = Integer.parseInt(line);

        check = true;
    } catch (NumberFormatException e) {
        System.out.println("Eingabe ist falsch");
    }
} while (!check);

System.out.println("getout");

为了帮助您将我的解释形象化,我将写出一个示例输入,然后我将显示每个步骤中数据的位置。假设我abc使用您的原始代码进入控制台。然后程序进入一个无限循环,原因如下:

我进入abc输入流:

System.in:abc
扫描:
输入:


scanabc在尝试查找整数时从输入流中读取:

System.in:
扫描:abc
输入:


scan无法转换abc为整数,因此会引发异常。但请注意,scan坚持到abc,它不仅会消失:

System.in:
扫描:abc
输入:


同样的事情再次发生,它试图转换abc为整数,但它不能,所以它再次抛出异常。看到无限循环发生了吗?

System.in:
扫描:abc
输入:

现在让我们试试我的代码。我将输入abc,然后123

我进入abc输入流:

System.in:abc
扫描:
行:
输入:


scan从输入流中读取abc,因为我告诉它读取下一行:

System.in:
扫描:abc
行:
输入:


scan将数据传递给line,因为它符合一行文本的条件:

System.in:
扫描:
行:abc
输入:


代码试图解析abc成一个整数,但它不能,所以它进入下一个循环迭代。 line对于循环的每次迭代都是本地的,因此它的旧值被丢弃:

System.in:
扫描:
行:
输入:


我进入123输入流:

System.in:123
扫描:
行:
输入:


scan从输入流中读取123,因为我告诉它读取下一行:

System.in:
扫描:123
行:
输入:


scan将数据传递给line,因为它符合一行文本的条件:

System.in:
扫描:
行:123
输入:


该代码成功解析123为一个整数,并将其分配给input. 没有无限循环,程序已经完成。

System.in:
扫描:
行:
输入:123


推荐阅读