Java 在使用nextInt时尝试内部catch语句,正确的实现方法?
我正在尝试构建一个最简洁的解决方案,只使用nextInt()方法和它抛出的排除错误的异常来读取用户的整数。。。 这是我目前拥有的代码:Java 在使用nextInt时尝试内部catch语句,正确的实现方法?,java,Java,我正在尝试构建一个最简洁的解决方案,只使用nextInt()方法和它抛出的排除错误的异常来读取用户的整数。。。 这是我目前拥有的代码: Scanner sn = new Scanner(System.in); boolean inputNotNull = true; while (inputNotNull) { try { int number = sn.nextInt(); System.out.printf(
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循环,在未发生任何事件时再次请求输入
我在这里使用的方法有一个缺陷,当用户输入非整数值的内容时,程序会重复打印错误消息,永远循环
如何避免这种情况
作为一个附带问题,您将如何解决我试图解决的这个问题?无限循环的原因是,当您尝试输入输入时,按enter键,在调用nextInt时,扫描仪将忽略额外字符(enter)。所以,当你们输入无效的数字时,你们会得到异常,扫描器会再次看到输入字符,因为你们并没有使用那个字符,所以你们永远也出不来 为了避免出现异常,请尝试在出现以下异常时使用该字符:
catch (InputMismatchException e) {
System.err.println("Wrong input! Input only integer numbers please...");
sn.nextLine();
}
这应该可以解决您的问题。无限循环的原因是,当您尝试输入输入时,按enter键,在调用nextInt时,扫描仪会忽略额外的字符(enter)。所以,当你们输入无效的数字时,你们会得到异常,扫描器会再次看到输入字符,因为你们并没有使用那个字符,所以你们永远也出不来
int Scanner::nextInt(int radix)
为了避免出现异常,请尝试在出现以下异常时使用该字符:
catch (InputMismatchException e) {
System.err.println("Wrong input! Input only integer numbers please...");
sn.nextLine();
}
这应该能解决你的问题
int Scanner::nextInt(int radix)
将输入的下一个标记扫描为int。返回从输入扫描的int。
抛出:
InputMismatchException
-如果下一个标记与整数正则表达式不匹配或超出范围
NoTouchElementException
-如果输入用尽
非法状态异常
-如果此扫描仪已关闭
你的方法是正确的。
您需要在捕获中添加以下内容:
sn.nextLine(); // eats up newline char
如果用户反复输入错误的数据,这也会反复显示错误,直到用户提供正确的输入(int)。
您可以添加另一个异常NoTouchElementException
,如果输入耗尽,则从循环中退出
将输入的下一个标记扫描为int。返回从输入扫描的int。
抛出:
InputMismatchException
-如果下一个标记与整数正则表达式不匹配或超出范围
NoTouchElementException
-如果输入用尽
非法状态异常
-如果此扫描仪已关闭
你的方法是正确的。
您需要在捕获中添加以下内容:
sn.nextLine(); // eats up newline char
如果用户反复输入错误的数据,这也会反复显示错误,直到用户提供正确的输入(int)。
您可以添加另一个异常NoSuchElementException
,如果输入耗尽,则退出循环捕获未检查的异常通常是一种不好的做法,我建议:
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;
}
}
捕获未检查的异常通常是一种不好的做法,我建议:
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;
}
}
为什么不直接获取行(字符串,而不是int)并尝试将其解析为int?您不需要捕获异常,这会将您带到下一行。您为什么不获取该行(字符串,而不是int)并尝试将其解析为int?您不需要捕获异常,这将使您进入下一行可能的重复