Java中的异常处理机制

86 阅读1分钟

注:本专栏文章均为本人原创,未经本人授权请勿私自转载,谢谢。

Java异常类层次结构图

-Throwable
    -Error      
        -AwtError
        -VirtualMachineError    
            -StackOverFlowError
            -OutOfMemoryError
    -Exception
        -IOException
            -EOFException
            -FileNotFoundException
        -RuntimeException     
            -ClassNotFoundException
            -NullPointerException
            -IllegalArgumentException
            -......

在 Java 中,所有的异常都有一个共同的祖先 java.lang 包中的 Throwable。Throwable 有两个重要的子类:Exception(异常)  和 Error(错误)

Error 是程序无法处理的错误。大多数 Error 与代码编写者执行的操作无关,一般为代码运行时 Java 虚拟机出现的问题,当这些异常发生时,Java 虚拟机一般会选择终止线程。

Exception 是程序本身可以处理的异常。Exception 类有一个重要的子类 RuntimeException。RuntimeException 异常由 Java 虚拟机抛出。

异常处理

  • Try 块:用于捕获异常。其后可接零个或多个 catch 块,如果没有 catch 块,则必须跟一个 finally 块。
  • Catch 块:用于处理 try 捕获到的异常。
  • Finally 块:无论是否捕获或处理异常,finally 块里的语句都会被执行。当在 try 块或 catch 块中遇到 return 语句时,finally 语句块将在方法返回之前被执行(若 finally 里有 return 语句,则会提前返回,如以下代码所示)。
public static int fun(int value) {
    try {
        return value;
    } finally {
        return 0;
    }
}

在以下特殊情况下,finally 块不会被执行:

  1. 在前面的代码中用了 System.exit(int) 已退出程序。
  2. 后台守护线程(daemon)被中止时。
  3. 断电等一系列外部因素导致的突发宕机。