Java 中的多个 Catch 块

2025年5月7日 | 阅读 5 分钟

在 Java 中,**多个 catch 块**允许我们单独处理不同类型的异常。当一个 try 块包含的代码可能抛出不同类型的异常时,这种方式非常有益。

因此,一个 try 块可以后面跟着一个或多个 catch 块。每个 catch 块必须包含一个不同的异常处理器。所以,如果我们必须在发生其他异常时执行各种任务,请使用**多重 catch 块**。

另外,我们可以在一个 catch 块中使用 |(管道符)符号分隔每个异常。

在一个 catch 块中捕获多个异常可以减少代码重复,提高效率。

语法

要记住的重要事项

  • 一次只发生一个异常,一次只执行一个 catch 块。
  • 所有 catch 块必须从最具体的到最一般的排序,即 ArithmeticException 的 catch 块必须放在 Exception 的 catch 块之前。

多重 catch 块的流程图

Java Catch Multiple Exceptions

多重 catch 块示例

让我们来看一个简单的 Java 多重 catch 块示例。

示例

编译并运行

输出

Arithmetic Exception occurs
rest of the code

示例:处理 ArrayIndexOutOfBoundsException

示例

编译并运行

输出

ArrayIndexOutOfBounds Exception occurs
rest of the code

在此示例中,try 块包含两个异常。但一次只发生一个异常,并执行其对应的 catch 块。

示例:处理 ArithmeticException

在此示例中,try 块包含可能引发多个异常的代码,但只处理第一个发生的异常。由于 30/0 会引发 ArithmeticException,因此会执行特定的 catch 块。

示例

编译并运行

输出

Arithmetic Exception occurs
rest of the code

示例:当任何异常与指定的异常不匹配时

在此示例中,我们生成了 NullPointerException,但没有提供相应的异常类型。在这种情况下,将调用包含父异常类 **Exception** 的 catch 块。

示例

编译并运行

输出

Parent Exception occurs
rest of the code

示例:将通用的 Exception catch 块放在具体块之前

在此示例中,try 块可能引发 ArithmeticException 和 ArrayIndexOutOfBoundsException。但是,一次只发生一个异常,并执行其对应的 catch 块。将通用的 Exception catch 块放在具体块之前会导致编译时错误,因为具体 catch 块变得不可达。

示例

输出

Main.java:13: error: exception ArithmeticException has already been caught
       catch(ArithmeticException e)
       ^
Main.java:17: error: exception ArrayIndexOutOfBoundsException has already been caught
catch(ArrayIndexOutOfBoundsException e)

多个 catch 块的优点

  • 特定异常处理:通过独立管理每种异常类型,您可以提供更准确的错误消息和恢复过程。
  • 代码清晰度和调试:它通过清晰简洁地展示各种错误的处理方式,有助于阅读和调试。
  • 更好的控制流:这使得程序员可以根据异常的类型做出不同的反应,从而获得更具弹性的应用程序。
  • 避免“catch-all”逻辑:这可以防止使用通用的 catch (Exception e) 来处理所有情况,否则可能会隐藏错误或异常行为。

多个 catch 块的缺点

  • 代码重复:具有相似逻辑的多个 catch 子句可能会导致重复的代码。
  • 维护开销:如果 catch 块未正确排列,它们可能会变得更加复杂,并增加维护的难度。
  • 不可达代码风险:当一个通用的 catch 块(例如 catch(Exception e))位于具体块之前时,会带来编译时错误,因为具体的 catch 块变得不可达。
  • 代码结构较长:如果使用过多的 catch 块,代码可能会变得冗长且不够简洁。

Java 多个 catch 块选择题

1. 关于 Java 中的多个 catch 块,请选择正确的说法?

  1. 它们允许在单独的块中处理不同类型的异常。
  2. 它们只能捕获相同类型的异常。
  3. 它们必须嵌套在彼此之内。
  4. Java 不支持它们。

答案:1)

解释:多个 catch 块允许我们单独处理不同类型的异常。一个 try 块后面可以跟一个或多个 catch 块。每个 catch 块必须包含一个不同的异常处理器。


2. 如果 try 块中抛出的异常类型没有匹配的 catch 块,会发生什么?

  1. 程序立即终止。
  2. 异常被忽略,程序继续执行。
  3. 异常会沿着调用堆栈向上传播,直到被捕获或程序终止。
  4. 会执行一个默认的 catch 块。

答案:3)

解释:如果 try 块中抛出的异常类型没有匹配的 catch 块,可能会发生以下情况:

  • 异常未被处理,导致程序异常终止。
  • Java 会打印一条带有堆栈跟踪的错误消息,显示异常发生的位置。
  • 除非异常被更高级别的异常处理器处理,否则不会发生进一步的执行。

3. 哪个块必须跟在 try 块之后?

  1. Final
  2. 捕获
  3. Finally
  4. 以上都不是

答案:2)

解释:catch 块必须跟在 try 块之后。它用于处理 try 块中发生的异常。


4. 可以在多个 catch 块之后放置 finally 块吗?

  1. 不,finally 块只能与单个 catch 块一起使用。
  2. Java 中不允许使用 finally 块。
  3. 只有在没有 catch 块的情况下才允许使用 finally 块。
  4. 是的,可以在多个 catch 块之后放置 finally 块。

答案:4)

解释:是的,可以在多个 catch 块之后放置 finally 块。放置 finally 块是可选的。即使没有 catch 块执行,它也会被执行。


5. 在 Java 7 或更高版本中,有什么功能允许我们在单个 catch 块中捕获多个异常?

  1. 嵌套的 catch 块
  2. 多重 catch 块
  3. 异常继承
  4. throws 关键字

答案:2)

解释:在 Java 中,多个 catch 块允许我们单独处理不同类型的异常。