我在网上发现这个代码是一个密码循环游戏,它运行正常,但我的问题是:如何?
这个 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码!永远。
答案 0 :(得分:1)
如果nextInt
抛出异常(因为输入的值不是int
),则输入catch
块。最后一行,
reader.next(); // <-- discards invalid token.
删除无效令牌,然后循环迭代。
另外,请勿将Code
1
int code = reader.nextInt();
1 使用对象类型,然后用==
测试相等性是一个坏主意™。此外,按照惯例,Java变量名称以小写字母开头。
答案 1 :(得分:1)
当输入除整数之外的任何内容时,catch块只捕获异常。由于Code
是Integer
,因此输入必须是整数。捕获异常并打印错误后,阅读器将移至下一个输入,直到输入正确的值,并且布尔值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");