Java的异常管理层级关系还是很清晰的。
其中,RuntimeException 可能是日常应用系统中出现最多的异常了,一般系统都会继续本系统的业务功能,继承RuntimeException,定义各种业务异常逻辑。
将派生自RuntimeException和Error的异常统称为unchecked异常,一开始蛮奇怪,但是从业务层解析还是可以很有道理的,我的理解是,RuntimeException一般而言是程序本来可以避免的错误,比如引用空指针,下标出错,Class.forName(),这种错误都需要程序自行处理。
如,spring的事务 @Transaction默认是处理RuntimeException和unchecked exceptions时才标识事务回滚;如果在事务中抛出其他类型的异常,但却期望 Spring 能够回滚事务,就需要指定 rollbackFor属性。
PS:Spring建议@Transaction注解在具体的类上使用,如果在接口上实现,除非设置了基于接口的代理,因为注解是不能继承的。