如果这个问题看起来太愚蠢或基本,我会提前道歉。但谷歌的搜索并没有把我带到任何地方。
代码很简单:
public class Average3 {
public static void main(String[] args) {
try {
printAverage(100, 0);
} catch (ArithmeticException ae) {
ae.printStackTrace();
System.out.println("Exception handled in " +
"main().");
}
System.out.println("Exit main().");
}
public static void printAverage(int totalSum, int totalNumber) {
try {
int average = computeAverage(totalSum, totalNumber);// (8)
System.out.println("Average = " +
totalSum + " / " + totalNumber + " = " + average);
} catch (IllegalArgumentException iae) {
iae.printStackTrace();
System.out.println("Exception handled in " +
"printAverage().");
}
System.out.println("Exit printAverage().");
}
public static int computeAverage(int sum, int number) {
System.out.println("Computing average.");
return sum/number;
}
}
输出:
Computing average.
java.lang.ArithmeticException: / by zero
at Average3.computeAverage(Average3.java:30)
at Average3.printAverage(Average3.java:17)
at Average3.main(Average3.java:6)
Exception handled in main().
Exit main().
这里我期待IllegalArgumentException,因为除以0会发生在printAverage调用的computeAverage中。在我看来,try语句应该跳过,它应该移动到此时注册IllegalArgumentException的catch。
我实际上有一个多云的理解,但我想确切地知道发生了什么以及为什么。我一直在绞尽脑汁。
感谢您的帮助。
答案 0 :(得分:0)
应在computeAverage
抛出异常,并在printAverage
答案 1 :(得分:0)
computeAverage
内的printAverage
次调用正在抛出您未处理的ArithmeticException
。
因此,catch
的{{1}}语句未执行,执行将在您的语句中停止:
IllegalArgumentException
......抛出System.out.println("Average = " + totalSum + " / " + totalNumber + " = " + average);
。
这是在ArithmeticException
方法中捕获的,然后您在main
上调用printStackTrace
。
因此,您可能想要ArithmeticException
方法中的catch ArithmeticException
而不是printAverage
(可能会重新抛出IllegalArgumentException
,包裹在IllegalArgumentException
作为根本原因)。
但是,最好的方法可能是首先检查你的参数,如果有什么东西导致ArithmeticException
除法,则抛出IllegalArgumentException
。