这个catch块内发生了什么?

时间:2016-04-27 18:54:12

标签: java

我在网上发现这个代码是一个密码循环游戏,它运行正常,但我的问题是:如何?

这个 catch block 究竟发生了什么?

我特别好奇这条线:

  

reader.next();

boolean loop = true;
    Scanner reader = new Scanner(System.in);
    System.out.println("PIN: ");

    while (loop) {
        try {
            Integer Code = reader.nextInt();

            if (Code == 8273) {
                System.out.println("Access granted");
                loop = false;
            } else {
                System.out.println("Access denied");
            }
        } catch (Exception e) {
            System.out.println("Please enter a valid PIN!");
            reader.next();
        }
    }

编辑:当然我故意输入一个非整数输入来引发异常。

Edit2: 当我删除该行时,程序继续打印请输入有效的PIN码!永远。

3 个答案:

答案 0 :(得分:1)

如果nextInt抛出异常(因为输入的值不是int),则输入catch块。最后一行,

reader.next(); // <-- discards invalid token.

删除无效令牌,然后循环迭代。

另外,请勿将Code 1

打包
int code = reader.nextInt();

1 使用对象类型,然后用==测试相等性是一个坏主意™。此外,按照惯例,Java变量名称以小写字母开头。

答案 1 :(得分:1)

当输入除整数之外的任何内容时,catch块只捕获异常。由于CodeInteger,因此输入必须是整数。捕获异常并打印错误后,阅读器将移至下一个输入,直到输入正确的值,并且布尔值loop变为false,这将结束if语句末尾的while循环输入正确的值后。

答案 2 :(得分:1)

事实上,程序员真正想要的是捕获下一行输入,并验证它是否是一个有效的整数。

但诚然,这段代码非常令人困惑。它依赖于这样一个事实:默认情况下,当你吞下&#34;除.nextLine()以及Scanner以外的任何内容的下一个标记,它依赖于当前的delimiter,默认情况下会匹配换行符。

不好。

这是一个更明确的版本:

String input;
int code;

while (true) {
    System.out.print("PIN: ");
    input = reader.nextLine();
    try {
        code = Integer.parseInt(input);
    } catch (NumberFormatException ignored) {
        // not an integer!
        System.out.println("Enter a valid PIN!");
        continue;
    }
    if (code == 8273)
        break;
    System.out.println("Access denied");
}

System.out.println("Access granted");