Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 这个挡块里面发生了什么?_Java - Fatal编程技术网

Java 这个挡块里面发生了什么?

Java 这个挡块里面发生了什么?,java,Java,我在网上发现这段代码是一个密码循环游戏,它运行良好,但我的问题是:如何 在这个捕捉块中到底发生了什么 我对这一行特别好奇: reader.next() 编辑:当然,我故意输入了一个非整数输入来引起异常 编辑2: 当我删除该行时,程序继续打印请输入有效PIN!永远。如果nextInt引发异常(因为输入的值不是int),则输入catch块。最后一行 reader.next(); // <-- discards invalid token. 1使用对象类型,然后用==测试相等性是一个坏主意™.

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

在这个捕捉块中到底发生了什么

我对这一行特别好奇:

reader.next()

编辑:当然,我故意输入了一个非整数输入来引起异常

编辑2:
当我删除该行时,程序继续打印请输入有效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");