java NoTouchElementException无限循环与pmd DDA异常
我对编程有点陌生,对gradle和pmd插件也很陌生,所以请发发慈悲吧
如果用户输入了一个数字,请选择扫描仪。nextLine()将在每次迭代中抛出一个NoSuchElementException,从而创建一个无限循环
public class Console {
public int readInteger(String line) {
Integer x = null;
while(x == null) {
try(Scanner scanner = new Scanner(System.in) {
System.out.print(line);
x = scanner.nextInt();
} catch(InputMismatchException exc) {
//error message
} catch(InvalidStateException exc) {
//error message
} catch(NoSuchElementException exc) {
//error message
}
}
return x;
}
}
我将感激每一位伸出的援助之手
编辑:意识到,我的问题与扫描仪同时出现。nextLine()方法。顺序不重要,我的循环仍然是一个无限循环,具有相同的NoTouchElementException
# 1 楼答案
下面是完整的(可编译的)示例:
注意:InvalidStateException不存在,它是非法的StateException
将此代码段保存在
Console.java
中,并使用类似于java Console.java
的java 11+运行它如果您正在输入例如
42
,它会工作。如果不输入整数,则“无止境循环”开始,例如very old
。现在我们需要实际处理异常。在这种情况下,InputMismatchException
将被抛出。但是错误的输入不会被使用,并且仍在扫描程序中-因此使用nextInt()
重试将再次引发相同的异常。在用户输入新数据之前,我们必须先读取错误的令牌。我们可以使用nextLine()
读取数据,但因此我们需要访问扫描器,因此我们需要更早地打开扫描器实例,并在外部资源中进行循环和错误处理如果用户关闭输入流(在Windows下使用}
Ctlr+Z
或在Linux下使用Cltr+D
),那么NoSuchElementException
将被抛出,因此我们也需要处理这种情况^如果扫描程序实例本身已关闭,则将抛出{下面是一个固定的完整示例:
# 2 楼答案
只要换个颜色就行了
到
也不,它不会进入无限循环,因为您使用了错误的方法,它根本不会工作