这是我参与8月更文挑战的第6天,活动详情查看:8月更文挑战
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。