Java异常类层次图
在 Java 中,所有的异常都有⼀个共同的祖先 java.lang 包中的 Throwable 类。 Throwable 类有两个重要的⼦类 Exception (异常)和 Error (错误)。 Exception 能被程序本身处理( try-catch ), Error 是⽆法处理的(只能尽量避免)。
Exception 和 Error ⼆者都是 Java 异常处理的重要⼦类,各⾃都包含⼤量⼦类。
- Exception**:**程序本身可以处理的异常,可以通过 catch 来进⾏捕获。Exception⼜可以分为受检查异常(必须处理)和不受检查异常(可以不处理)。
- 受检查异常
Java 代码在编译过程中,如果受检查异常没有被 catch / throw 处理的话,就没办法通过编译。
除了 RuntimeException 及其⼦类以外,其他的 Exception 类及其⼦类都属于检查异常 。常⻅的受检查异常有: IO 相关的异常ClassNotFoundException 、 SQLException …。
- 不受检查异常
Java 代码在编译过程中 ,我们即使不处理不受检查异常也可以正常通过编译。
RuntimeException 及其⼦类都统称为⾮受检查异常,例如: NullPointExecrption 、 NumberFormatException (字符串转换为数字)、 ArrayIndexOutOfBoundsException (数组越界)、 ClassCastException (类型转换错误)、 ArithmeticException (算术错误)等。
Error : Error属于程序⽆法处理的错误 ,我们没办法通过 catch 来进⾏捕获 。例如,Java 虚拟机运⾏错误(Virtual MachineError)、虚拟机内存不够错误( OutOfMemoryError )、类定义错误( NoClassDefFoundError )等 。这些异常发⽣时,Java虚拟机(JVM)⼀般会选择线程终⽌。
Throwable 类常用方法
public string getMessage():返回异常发⽣时的简要描述
- public string toString():返回异常发⽣时的详细信息
- public string getLocalizedMessage():返回异常对象的本地化信息。使⽤ Throwable 的⼦类覆盖这个⽅法,可以⽣成本地化信息。如果⼦类没有覆盖该⽅法,则该⽅法返回的信息与getMessage()返回的结果相同
public void printStackTrace():在控制台上打印 Throwable 对象封装的异常信息
异常处理总结
try **块: **⽤于捕获异常。其后可接零个或多个 catch 块,如果没有 catch 块,则必须跟⼀个 finally 块。
- catch **块: **⽤于处理 try 捕获到的异常。
- finally **块: **⽆论是否捕获或处理异常, finally 块⾥的语句都会被执⾏。当在 try 块或catch 块中遇到 return 语句时, finally 语句块将在⽅法返回之前被执⾏。
在以下 3 种特殊情况下, finally 块不会被执行:
- 在 try 或 finally 块中⽤了 System.exit(int) 退出程序。但是,如果 System.exit(int) 在异常语句之后, finally 还是会被执⾏
- 程序所在的线程死亡
- 关闭 CPU
注意: 当 try 语句和 finally 语句中都有 return 语句时,在⽅法返回之前,finally 语句的内容将被执⾏,并且 finally 语句的返回值将会覆盖原始的返回值。