应该抛出/捕获哪个异常

时间:2016-07-06 15:03:03

标签: java exception

如果这个问题看起来太愚蠢或基本,我会提前道歉。但谷歌的搜索并没有把我带到任何地方。

代码很简单:

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。

我实际上有一个多云的理解,但我想确切地知道发生了什么以及为什么。我一直在绞尽脑汁。

感谢您的帮助。

2 个答案:

答案 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