参考博客:
https://snailclimb.gitee.io/javaguide/#/docs/java/basis/Java%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86?id=_321-java-%e5%bc%82%e5%b8%b8%e7%b1%bb%e5%b1%82%e6%ac%a1%e7%bb%93%e6%9e%84%e5%9b%be
1、Java 异常类层次结构图
2、Error 、Exception
在 Java 中,所有的异常都有一个共同的祖先 java.lang.Throwable
类。
Throwable
类有两个重要的子类:Exception
(异常)、Error
(错误),它们各自都包含大量子类;
Exception
能被程序本身处理 (try-catch
),Error
是无法处理的 (只能尽量避免);
Error
:Error
属于程序无法处理的错误,我们没办法通过catch
来进行捕获。例如,Java 虚拟机运行错误 (Virtual MachineErro)、虚拟机内存不够错误 (OutOfMemoryError) 、类定义错误 (NoClassDefFoundError) 等。这些异常发生时,Java 虚拟机一般会选择线程终止。Exception
:程序本身可以处理的异常,可以通过catch
来进行捕获。Exception
有可以分为 受检查异常 (必须处理) 和 不受检查异常 (可以不处理)。- 受检查异常
- Java 代码在编译过程中,如果受检查异常没有被
catch
/throw
处理的话,就没办法通过编译; - 除了
RuntimeException
及其子类以外,其他的Exception
类及其子类都属于受检查异常; - 常见受检查异常有:
IOException
、ClassNotFoundException
、SQLException
……
- Java 代码在编译过程中,如果受检查异常没有被
- 不受检查异常
- Java 代码在编译过程中 ,我们即使不处理不受检查异常也可以正常通过编译;
RunntimeException
及其子类统称为不受检查异常;- 例如:
NullPointerException
(空指针异常)、NumberFormatException
(字符串转换为数字)、ArrayIndexOutOfBoundsException
(数组下标越界)、ClassCastException
(类型转换异常)、ArithmeticException
(算数错误) 等。
- 受检查异常
3、try-catch-finally
-
try
块:用于捕获异常,其后可接零个或多个catch
块,如果没有catch
块,则必须跟一个finally
块; -
catch
块:用于处理 try 捕获到的异常; -
finally
块:无论是否捕获或处理异常,finally
块里的语句都会被执行。当在try
块或catch
块中遇到return
语句时,finally
语句块将在方法返回之前被执行public static int test(){ try{ return 5; } catch (Exception e){ e.printStackTrace(); } finally{ return 8; } } // 最后返回的是:8
** 以下三种特殊情况下,finally
将不会被执行:
- 在
try
或catch
块中用了System.exit(0)
退出程序; - 程序所在的线程死亡;
- 关闭 CPU。