我正在尝试构建最简单的解决方案,仅使用nextInt()方法从用户读取整数,并抛出异常以排除错误... 这是我现在的代码:
Scanner sn = new Scanner(System.in);
boolean inputNotNull = true;
while (inputNotNull) {
try {
int number = sn.nextInt();
System.out.printf("The number %d is power of 2: %b\n", number, isPowerOfTwo(number));
if (number == 0) {
inputNotNull = false;
}
}
catch(InputMismatchException e) {
System.err.println("Wrong input! Input only integer numbers please...");
}
}
所以,这应该是等待用户的整数。如果用户输入 0 结束该程序。 我的想法是当用户使用 InputMismatchException 输入除整数以外的其他内容时尝试排除场景(我知道这不是捕获RuntimeException的最佳做法)。当引发异常时,将打印一条错误消息,程序将返回到while循环,再次询问输入是否发生。
我在这里使用的方法有一个缺陷,当用户输入的内容不是整数值时,程序会重复打印错误消息,永远循环。
如何避免这种情况?
作为一个侧面问题,您如何解决我想要解决的问题?
答案 0 :(得分:0)
无限循环的原因是当您尝试输入输入时,按下回车键,调用nextInt时,扫描仪会忽略该额外字符(输入)。因此,当您输入无效数字时,您会获得异常,并且扫描仪再次看到输入字符,因为您没有消耗该字符,因此您永远不会出现它。
为了避免它在你遇到异常时尝试使用该字符:
catch (InputMismatchException e) {
System.err.println("Wrong input! Input only integer numbers please...");
sn.nextLine();
}
这应该可以解决您的问题。
答案 1 :(得分:0)
int Scanner::nextInt(int radix)
将输入的下一个标记扫描为int。返回从输入中扫描的int。
抛出:
InputMismatchException
- 如果下一个标记与整数正则表达式不匹配,或者超出范围
NoSuchElementException
- 如果输入已用尽
IllegalStateException
- 如果此扫描仪已关闭
你的方法是正确的。 您需要在捕获中添加:
sn.nextLine(); // eats up newline char
如果用户重复输入错误的数据,这也会反复显示错误,直到用户提供正确的输入(int)。
您可以添加另一个异常NoSuchElementException
,如果输入已用尽,则退出循环
答案 2 :(得分:0)
Scanner sn = new Scanner(System.in);
boolean inputNotNull = true;
while (inputNotNull) {
String line = sn.nextLine();
Integer number = null;
try {
number = Integer.parseInt(line);
} catch (NumberFormatException e) {
System.err.println("Wrong input! Input only integer numbers please: " + e.getMessage());
continue;
}
System.out.printf("The number %d is power of 2: %b\n", number, isPowerOfTwo(number));
if (number == 0) {
inputNotNull = false;
}
}