Java 的异常体系为开发者提供了一种捕获和处理运行时错误的机制,用于处理在程序执行期间可能出现的错误和意外情况。主要的异常分类包括Error
和Exception
,而Exception
又可以进一步分为受检异常和非受检异常。
- Error 表示严重的系统错误,不应该进行捕获。
- 受检异常需要在编译时处理,通常用于外部资源(如 I/O、数据库等)。
- 非受检异常可以不显式处理,通常由编程错误引起,如空指针、除以零等。
Throwable 类
在 Java中,所有的异常都是java.lang.Throwable
类的子类。Throwable
有两个主要的子类:
Error
Exception
-
Error类
-
Error
表示的是系统级的严重问题,通常无法通过编程来恢复或处理,例如虚拟机错误、内存不足等。 - 一些常见的
Error
子类包括:-
OutOfMemoryError
:JVM内存耗尽。 -
*Error
:栈溢出,例如递归调用过深导致栈空间耗尽。
-
-
Error
通常表示程序中不应当捕获的异常,因为这些错误通常不是由编程错误引起的,而是运行环境的问题。
-
-
Exception类
-
Exception
类表示应用程序可以捕获并进行处理的异常。 -
Exception
又进一步分为两种类型:受检异常(Checked Exception)和非受检异常(Unchecked Exception)。
2.1 受检异常(Checked Exception)
- 受检异常是那些在编译期就必须进行处理的异常,否则代码将无法通过编译。
- Java 编译器强制检查这些异常的处理,因此开发者必须显式地捕获或声明抛出这些异常。
- 典型的受检异常包括:
-
IOException
:当进行I/O操作时可能发生的异常,例如文件不存在或无法读取。 -
SQLException
:在与数据库交互时可能发生的异常,例如查询语法错误。
-
2.2 非受检异常(Unchecked Exception)
- 非受检异常是在程序运行时可能发生的异常,不需要在编译期进行强制处理。
- 非受检异常通常是由编程错误引起的,例如逻辑错误或者错误的操作,通常是
RuntimeException
的子类。 - 典型的非受检异常包括:
-
NullPointerException
:对null
引用调用方法或访问属性时发生。 -
ArrayIndexOutOfBoundsException
:数组下标越界。 -
ArithmeticException
:例如除以零的操作。
-
-
Java异常的继承结构总结
-
java.lang.Throwable
-
java.lang.Error
(系统级别错误,不应捕获)OutOfMemoryError
*Error
-
java.lang.Exception
(应用级别错误,可以捕获处理)-
受检异常(必须显式捕获或声明)
IOException
SQLException
-
非受检异常(不强制要求捕获)
-
RuntimeException
NullPointerException
ArrayIndexOutOfBoundsException
ArithmeticException
-
-
受检异常(必须显式捕获或声明)
-