如何使用扫描程序处理由无效输入(输入不匹配异常)引起的无限循环

2022-09-01 02:01:32

所以,我被困在这段代码中:

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;
    }
}

这是我的输出:

插入整数:
值无效!
插入整数:
值无效!
...


答案 1

根据Javadoc for Scanner:

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

这意味着如果下一个令牌不是 ,它会抛出 ,但令牌会保留在那里。因此,在循环的下一次迭代中,再次读取相同的令牌并再次引发异常。你需要的是用完它。在里面添加一个以使用令牌,该令牌无效,需要丢弃。intInputMismatchExceptionreader.nextInt()reader.next()catch

...
} catch (InputMismatchException e) {
    System.out.println("Invalid value!");
    reader.next(); // this consumes the invalid token
} 

答案 2

我要做的是使用Scanster.nextLine()阅读整行。然后创建另一个读取返回字符串的扫描仪。

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;
    }

通过这种方式,您有一个扫描仪来获取输入,另一个扫描仪可以验证它,因此您不必担心读者是否输入了正确形式的输入。


推荐