多重捕获的工作原理 - 1

“还有一些有趣的课程。噢,我多么喜欢教书!”

“我给大家介绍一下多重 catch 块的工作原理。很简单:try 块中发生异常时,执行移动到第一个 catch 块。”

“如果 catch 块括号中指示的类型与抛出异常的类型匹配,则在该块内部开始执行。”否则,我们移动到下一个 catch 块,其中执行相同的检查”。

“如果 catch 块用完还未捕获异常,则异常会重新抛出并且当前方法会异常终止。”

“我明白了。与异常类型一致的 catch 块会立即执行。”

“是的,不错。但实际情况有点复杂。类可以继承其他类。如果 Cow 类继承了 Animal 类,则 Cow 对象不仅会被 Cow 变量引用,也会被 Animal 变量引用。”

“然后呢?”

“因为所有的异常继承 ExceptionRuntimeException(这也继承 Exception),它们仍然可以使用‘catch (Exception e)’或‘catch (RuntimeException e)’。”

“然后呢?”

“我们可以得出两个结论。首先,你可以使用‘catch (Exception e)’捕获任何异常。其次,catch 块的顺序很重要。

“下面是一些示例:”

“除以 0 后发生的 ArithmeticException 会在第二个 catch 块被捕获”。

代码
try
{
    System.out.println("调用 method1 之前。");
    int a = 1 / 0;
    System.out.println("调用 method1 之后。这将永远不会显示。");
}
catch (NullPointerException e)
{
    System.out.println("空引用。已捕获异常。");
}
catch (ArithmeticException e)
{
    System.out.println("除以零。已捕获异常。");
}
catch (Exception e)
{
    System.out.println("其他任何错误。已捕获异常。");
}

“在下例中,ArithmeticException 会在第一个 catch 块被捕获,因为所有的异常继承 Exception,即 Exception 涵盖所有异常。”

代码
try
{
    System.out.println("调用 method1 之前。");
    int a = 1/0;
    System.out.println("调用 method1 之后。这将永远不会显示。");
}
catch (Exception e)
{
    System.out.println("其他任何错误。已捕获异常。");
}
catch (NullPointerException e)
{
    System.out.println("空引用。已捕获异常。");
}
catch (ArithmeticException e)
{
    System.out.println("除以零。已捕获异常。");
}

“在下例中,ArithmeticException 不会被捕获。它会被重新抛回到调用方法。”

代码
try
{
    System.out.println("调用 method1 之前。");
    int a = 1/0;
    System.out.println("调用 method1 之后。这将永远不会显示。");
}
catch (NullPointerException e)
{
    System.out.println("空引用。已捕获异常。");
}

“这样的确说得清楚一些。这些异常并不是简单的话题。”

“只是看起来是这样。它们实际上是 Java 中最简单的内容。”

“我不知道是该高兴还是难过…”