在 Java 中,所有的异常都有一个共同的祖先 java.lang 包中的 Throwable 类。Throwable 类有两个重要的子类 Exception(异常)和 Error(错误)。Exception 能被程序本身处理(try-catch), Error 是无法处理的(只能尽量避免)。
Exception 和 Error 二者都是 Java 异常处理的重要子类,各自都包含大量子类。
Exception
-
Exception
:程序本身可以处理的异常,可以通过catch
来进行捕获。Exception
又可以分为 受检查异常(必须处理) 和 不受检查异常(可以不处理)。-
受检查异常(Java 代码在编译过程中,如果受检查异常没有被
catch
/throw
处理的话,就没办法通过编译 。)-
除了
RuntimeException
及其子类以外,其他的Exception
类及其子类都属于受检查异常 。常见的受检查异常有: IO 相关的异常、ClassNotFoundException
、SQLException 等等
。
-
-
不受检查异常(Java 代码在编译过程中 ,我们即使不处理不受检查异常也可以正常通过编译。)
-
RuntimeException
及其子类都统称为非受检查异常。 -
RuntimeException 及其子类都统称为非受检查异常,例如:NullPointException、NumberFormatException(字符串转换为数字)、ArrayIndexOutOfBoundsException(数组越界)、ClassCastException(类型转换错误)、ArithmeticException(算术错误)等。
-
-
Error
-
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-finally
-
try
块: 用于捕获异常。其后可接零个或多个catch
块,如果没有catch
块,则必须跟一个finally
块。 -
catch
块: 用于处理 try 捕获到的异常。 -
finally
块: 无论是否捕获或处理异常,finally
块里的语句都会被执行。当在try
块或catch
块中遇到return
语句时,finally
语句块将在方法返回之前被执行。
在以下 3 种特殊情况下,finally不会执行:
-
在
try
或finally
块中用了System.exit(int)
退出程序。但是,如果System.exit(int)
在异常语句之后,finally
还是会被执行。 -
程序所在的线程死亡。
-
关闭 CPU。