Java 这个挡块里面发生了什么?
我在网上发现这段代码是一个密码循环游戏,它运行良好,但我的问题是:如何 在这个捕捉块中到底发生了什么 我对这一行特别好奇: reader.next() 编辑:当然,我故意输入了一个非整数输入来引起异常 编辑2:Java 这个挡块里面发生了什么?,java,Java,我在网上发现这段代码是一个密码循环游戏,它运行良好,但我的问题是:如何 在这个捕捉块中到底发生了什么 我对这一行特别好奇: reader.next() 编辑:当然,我故意输入了一个非整数输入来引起异常 编辑2: 当我删除该行时,程序继续打印请输入有效PIN!永远。如果nextInt引发异常(因为输入的值不是int),则输入catch块。最后一行 reader.next(); // <-- discards invalid token. 1使用对象类型,然后用==测试相等性是一个坏主意™.
当我删除该行时,程序继续打印请输入有效PIN!永远。如果
nextInt
引发异常(因为输入的值不是int
),则输入catch
块。最后一行
reader.next(); // <-- discards invalid token.
1使用对象类型,然后用
==
测试相等性是一个坏主意™. 此外,按照惯例,Java变量名以小写字母开头。当输入除整数以外的任何内容时,catch块只捕获异常。由于code
是一个整数
,因此输入必须是一个整数。捕获异常并打印错误后,读取器移动到下一个输入,直到输入正确的值,布尔循环
变为false,一旦输入正确的值,则在if
语句末尾结束while循环 实际上,程序员真正想要的是捕获下一行输入,并验证这是否是一个有效的整数
但不可否认,代码非常混乱。它依赖于这样一个事实:默认情况下,当您使用扫描仪
而不是.nextLine()
来“吞下”下一个标记时,它依赖于当前标记,默认情况下,当前标记与换行符相匹配
不太好
以下是一个更明确的版本:
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");
我试图将其更改为(reader.nextInt())以理解,但它立即抛出了另一个InputMismatchException,但对于什么输入?是否有某种类型的异常被抛出?是的,当我输入非整数值时是的,这里的问题是捕获了
异常
,对吗?这意味着它还将捕获任何运行时异常
。。。包括NumberFormatException
。不管怎样,代码本身非常粗糙…@fge好吧,我想我真的应该更改我的银行卡PIN。你的意思是这一行取代了这一行:Integer code=reader.nextInt()?谢谢您的回复。@mhashem6是的,因为a)code
应该是code
,b)将int
装箱为整数(reader.nextInt()
返回一个int
)与您的代码不符。我在网站上找到它时复制了它(Android权威机构)因为我不知道这个替换输入的东西在catch块中是可能的Exception
是RuntimeException
的超类,它本身就是NumberFormatException
的超类。和RuntimeException
以及子类在Java中是特殊的,因为它们是未检查的异常。这意味着捕获异常是一种非常非常糟糕的做法。
int code = reader.nextInt();
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");