如何使用Scanner处理由无效输入(InputMismatchException)引起的无限循环

mat*_*aso 34 java infinite-loop java.util.scanner

所以,我对这段代码感到困惑:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的输出:

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

sam*_*aur 58

根据扫描仪的javadoc:

当扫描程序抛出InputMismatchException时,扫描程序将不会传递导致异常的标记,因此可以通过其他方法检索或跳过它.

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

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

  • +1读者注意:根据情况,您可能要使用`nextLine()`而不是`next()`,这样像`this这样有空格'的输入不会触发多个异常。 (3认同)