当前位置: 首页 > 知识库问答 >
问题:

如何使用扫描器处理无效输入(InputMismatchException)导致的无限循环

强志学
2023-03-14

所以,我被这段代码困住了:

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

public class ConsoleReader {

    Scanner reader;

    public ConsoleReader() {
        reader = new Scanner(System.in);
        //reader.useDelimiter(System.getProperty("line.separator"));
    }

    public int readInt(String msg) {
        int num = 0;
        boolean loop = true;

        while (loop) {
            try {
                System.out.println(msg);
                num = reader.nextInt();

                loop = false;
            } catch (InputMismatchException e) {
                System.out.println("Invalid value!");
            } 
        }
        return num;
    }
}

这是我的输出:

插入一个整数:< br >无效值!< br >插入一个整数:< br >无效值!< br >...

共有3个答案

夏立果
2023-03-14

while-do的保护是“循环”变量。

在代码到达赋值循环之前引发的异常本身= false准确地说,异常是在前面的语句中抛出的,该语句是num = reader . nextint();

要终止这个while-do,您需要用另一个逻辑事物来保护您的while-do,例如:

  1. 当读取器获得非整型字符时退出
  2. 在 EOF 时退出
寿伟
2023-03-14
String line = reader.nextLine();
Scanner sc = new Scanner(line);
  public int readInt(String msg) {
        int num = 0;
        boolean loop = true;

        while (loop) {
            try {
                System.out.println(msg);
                String line = reader.nextLine();
                Scanner sc = new Scanner(line);
                num = sc.nextInt();   
                loop = false;
            } catch (InputMismatchException e) {
                System.out.println("Invalid value!");

            } 
        }
        return num;
    }

这样,您就有了一个获取输入的扫描器和一个验证输入的扫描器,这样您就不必担心读者是否关心他们是否输入了正确的输入形式。

壤驷康裕
2023-03-14

根据扫描仪的javadoc:

当扫描程序引发 InputMismatchException 时,扫描程序将不会传递导致异常的令牌,因此可以通过其他方法检索或跳过该标记。

这意味着,如果下一个标记不是< code>int,它将抛出< code > InputMismatchException ,但该标记将保留在那里。因此,在循环的下一次迭代中,< code>reader.nextInt()再次读取相同的标记,并再次引发异常。你需要的是把它用光。在< code>catch中添加一个< code>reader.next()来使用令牌,该令牌无效,需要丢弃。

...
} catch (InputMismatchException e) {
    System.out.println("Invalid value!");
    reader.next(); // this consumes the invalid token
} 
 类似资料:
  • 我是一个初学者,我写了一个java程序,允许你输入n个数字,它只显示最大值、最小值和平均值,如果输入了数字-5,我的程序显示不正确,我需要一些帮助。我想在输入字符串而不是整数时使用try/catch来捕获错误。

  • 我想让用户输入一个String和四个整数值,如果用户输入的类型不匹配,我想让程序继续要求用户输入整数值,为什么代码会一直循环,如果用户插入了错误的类型,永远不会等待用户输入?

  • 正如使用boto3完全扫描dynamoDb中所解释的,我构建了一个解决方案,使用某些条件完全扫描dynamoDb表。这是我的代码: 但是当代码被执行时,它会进入一个无限循环。这是LastEvaluatedKey每次迭代的输出: 它一直在这两对之间循环。 编辑: 我添加了do_scan方法。

  • 如果输入了正确的文件名,就没有问题。如果输入了不正确的文件名,无限循环会不断告诉用户输入一个文件名。但它不会等待用户输入文件名。它在无限循环中不断处理第一个错误数据。我在catch块中使用nextLine,它应该清除错误的输入。还尝试了reset()。我做错了什么?

  • 问题内容: boolean z = false; do { try { a = sc.nextInt(); z = true; } catch(Exception e) { } } while(!z); 试试这个。如果您第一次尝试整数,则整数将正确执行。但是,如果您输入错误的文本类型,即使您接下来输入int并跳过将布尔值分配为true的情况,也会变成无限循环。为什么是这样? 问题答案: 您的问题出