为什么我得到这个奇怪的错误,只有一个类型错误而不是零除法错误?



所以我真的有两个问题。第一个是,在 Java 中,我如何做这个 python 代码的等效项:

while True:
try:
num1 = int(input('Enter num1: '))
num2 = int(input('Enter num2: '))
print(str(num1) + ' / ' + str(num2) + ' = ' + str(num1 / num2))
break
except:
print('ERROR')

我想要的是程序对用户说"不,你做错了!现在再做一次,直到你做对为止。我尝试用java编写以下内容:

import java.util.Scanner;
public class TryCatch {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
while (true) {
try {
System.out.print("Enter num1: ");
int num1 = input.nextInt();
System.out.print("Enter num2: ");
int num2 = input.nextInt();
System.out.println(num1 + " / " + num2 + " = " + num1 / num2);
break;
} catch (Exception e) {
System.out.println(e);
System.out.println(e.getCause());
System.out.println(e.getMessage());
}
}
}
}

现在,当 num2 等于 0 时,这也完全符合我的需求。作为参考,这是发生这种情况时的输出,我在第一次迭代后终止了该过程:

Enter num1: 5
Enter num2: 0
java.lang.ArithmeticException: / by zero
null
/ by zero
Enter num1: 
Process finished with exit code 1

但是,当 num1 或 num2 是字符串时,java 会在无限循环中打印以下 3 行,直到我终止进程:

java.util.InputMismatchException
null
null

这显然意味着我做错了什么,但对于我的生活,我不知道为什么 catch 块一直以无限循环运行,出现类型错误,而不是零除法错误...... 所以我的两个具体问题是:

  1. 如何实现我所描述的我想做的事情?即让程序告诉用户"不,你做错了!现在再做一次,直到你做对为止。
  2. 这是一个不正确的解决方案的原因是什么?即,当存在类型错误但没有零除错误时,为什么 catch 块在无限循环中运行?

编辑: 由于我只能接受 1 个答案,我想特别感谢 @rgettman 解释 nextInt() 方法如何导致我的特定问题,并@Alireza Dastyar 为我提供了我认为更优雅的解决方案,因为它改变了抛出异常的位置,而不是在事后清理混乱的输入,这意味着当该特定异常未抛出时,您已经给出了虚拟输入。

执行永远不会被零除。 当您键入nextInt()无法处理的内容时,该方法会在执行到达除法表达式之前引发InputMismatchException

此外,当使用输入的Scanner方法引发该异常时,它不会使用有问题的输入,循环会重复,并且nextInt()在同一输入上引发异常,从而导致无限循环。

javadocsnextInt()

如果下一个标记无法转换为有效的 int 值,则此方法将引发InputMismatchException,如下所述。如果翻译成功,扫描程序将前进到匹配的输入之外。

  1. catch块中,将消息打印给用户以重试。
  2. 调用catch块中的input.next()以使用不正确的输入并前进到下一个令牌。

当不正确的输入是第一个输入时,您需要仔细处理输入;在这种情况下,可能有2个输入标记需要跳过。

请考虑调用hasNextInt()以确定输入上是否有要分析的整数。

相关内容

最新更新