Java 中的不可达 catch 块是什么?


在任何情况下都**无法到达**的语句块被称为**不可达块**。Java 不支持不可达块。使用**Exception 类**引用的 catch 块应该并且必须始终是最后一个 catch 块,因为**Exception** 是所有异常的**超类**。当我们保留多个 catch 块时,**catch 块的顺序必须从最具体到最通用**。即 Exception 的子类必须放在前面,超类放在后面。如果我们先保留超类,然后保留子类,编译器将**抛出不可达 catch 块错误**。

语法

try {
   // statements
} catch(Exception e) {
   System.out.println(e);
} catch(NumberFormatException nfe) { //unreachable block. Not supported by Java, leads to an error.
   System.out.println(nfe);
}

如果以下两个条件都为真,则编译器认为 catch 子句是可达的

  • 在 try 块中抛出的已检查异常可以分配给 C 的参数。
  • 没有前一个 catch 子句的参数类型等于或为 C 的参数类型的超类型。

编译器认为可达的 catch 子句如果以下两个条件都为真,则可能变得不可达

  • catch 子句参数类型 E 不包含任何未检查异常。
  • 在 try 块中抛出的类型为 E 的(严格)子类型的所有异常都已由前面的 catch 子句处理。

示例

在线演示

public class UnreachableBlock{
   public static void main(String[] args) {
      try {
         int i = Integer.parseInt("abc"); //This statement throws NumberFormatException
      } catch(NumberFormatException nfe) {
         System.out.println("This block handles NumberFormatException");
      } catch(Exception e) {
         System.out.println("This block handles all exception types");
      } catch (Throwable t) {
         System.out.println("Throwable is super class of Exception");
      }
   }
}

输出

This block handles NumberFormatException

更新于: 2020 年 2 月 6 日

5K+ 次查看

启动您的 职业生涯

通过完成课程获得认证

开始
广告