所以,我有两个问题。第一个是,在Java中,我该如何做与这个Python代码等效的操作:
我希望程序能够对用户说:“不,你做错了!现在再做一遍直到做对为止。”我尝试用Java编写了以下代码:
显然,这意味着我在做错了什么,但是就我而言,我不知道为什么catch块会因为类型错误而无限循环运行,而不是除以零错误... 所以我的两个具体问题是:
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会打印以下三行并进入无限循环,直到我终止该进程:
java.util.InputMismatchException
null
null
显然,这意味着我在做错了什么,但是就我而言,我不知道为什么catch块会因为类型错误而无限循环运行,而不是除以零错误... 所以我的两个具体问题是:
- 如何实现我想要做的事情?即使程序告诉用户“不,你做错了!现在再做一次,直到做对为止。”
- 这个解决方案为什么不正确?即为什么当出现类型错误时catch块会无限循环运行,而不是除以零错误?
编辑: 由于我只能接受1个答案,所以我想特别感谢@rgettman解释nextInt()方法如何导致我的特定问题,以及@Alireza Dastyar给出了我认为更优雅的解决方案,因为它改变了抛出异常的位置,而不是在事后清理混乱的输入,这意味着当特定的异常没有被抛出时,您必须提供虚拟输入。
nextInt()
抛出InputMismatchException
异常时,输入中没有任何字符被消耗,因此再次调用它将再次失败。您需要调用next()
或nextLine()
来消耗错误的输入。 - Andreas