Java中常见的异常分类,结合Spring的事务巩固复习
Java异常的继承关系是通过类继承的方式构建的一个层次结构。以下是对Java异常继承关系的详细图解说明:
异常类的顶层
- Throwable:所有异常和错误的超类。
Throwable的子类
- Error:通常是指与虚拟机相关的问题,如系统崩溃、虚拟机错误、动态链接失败等,这种错误无法恢复或不可能捕获,将导致应用程序中断。应用程序通常不应试图捕获Error对象。
- Exception:表示程序本身可以处理的异常。
Exception的子类
- 运行时异常(RuntimeException):编译器不要求强制处理的异常。常见的运行时异常包括
NullPointerException
(空指针异常)、IndexOutOfBoundsException
(下标越界异常)、ArithmeticException
(算术异常)等。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。 - 非运行时异常(检查异常,Checked Exception):编译器要求必须处理的异常。常见的检查异常包括
IOException
(输入输出异常)、SQLException
(SQL异常)、ClassNotFoundException
(类找不到异常)等。这些异常在编译时就需要被捕获或声明抛出。
异常继承关系的图解
由于无法直接在这里绘制图形,以下是用文字描述的异常继承关系图
Throwable
├── Error
└── Exception
├── RuntimeException(运行时异常)
│ ├── NullPointerException
│ ├── IndexOutOfBoundsException
│ ├── ArithmeticException
│ └── ...(其他运行时异常)
└── (检查异常,Checked Exception)
├── IOException
│ └── FileNotFoundException
├── SQLException
├── ClassNotFoundException
└── ...(其他检查异常)
异常处理的原则
- 对于运行时异常,开发者应该通过编写健壮的代码来尽量避免它们的出现,而不是依赖捕获异常来处理它们。
- 对于检查异常,开发者必须在方法签名中通过
throws
子句声明可能会抛出的异常,或者在方法内部使用try-catch
语句块来捕获并处理这些异常。
常见的运行时异常(Runtime Exception)
运行时异常是在程序运行时可能发生的异常,它们通常是由程序中的逻辑错误或不当操作引发的。Java编译器不会强制要求捕获或声明这些异常,但开发者应当通过编写健壮的代码来尽量避免它们的出现。常见的运行时异常包括:
- NullPointerException:当应用程序试图在需要对象的地方使用
null
时抛出。 - IndexOutOfBoundsException:当索引超出字符串或数组的有效范围时抛出。例如,
ArrayIndexOutOfBoundsException
和StringIndexOutOfBoundsException
。 - ArithmeticException:当发生数学错误时抛出,如除以零。
- ClassCastException:当试图将对象强制转换为不兼容的类时抛出。
- ArrayStoreException:当试图将错误类型的对象存储到数组中时抛出。
- BufferOverflowException:当向缓冲区写入的数据超出其容量时抛出。
- ConcurrentModificationException:当在不允许修改时(如在迭代过程中)修改集合时抛出。
常见的检查异常(Checked Exception)
检查异常是在编译时进行检查的异常。如果方法可能抛出检查异常,但调用者没有捕获或声明该异常,则编译器会报错。常见的检查异常包括:
- IOException:当发生输入输出错误时抛出,如读写文件失败。
- FileNotFoundException:当试图打开的文件不存在时抛出,是
IOException
的子类。 - SQLException:当访问数据库时发生SQL错误或数据访问错误时抛出。
- ClassNotFoundException:当应用程序试图动态加载类(如在运行时使用
Class.forName()
方法)但找不到指定的类时抛出。 - InterruptedException:当线程在等待、睡眠或尝试加入另一个线程时被中断时抛出。
- ParseException:当尝试将字符串解析为日期或数字时格式不正确时抛出,如
SimpleDateFormat
的parse()
方法可能抛出此异常。
需要注意:当程序抛出检查异常时,Spring的事务管理 @Transactional 默认是不会生效的,需要着重注意,默认情况下只会捕获:RuntimeException 和 Error 类型的异常,检查异常需要捕获处理时,就需要设置 rollbackFor 参数为:Exception 或者 Throwable 扩大事务的捕获范围!