RuntimeException和Exception的区别

简介: RuntimeException和Exception的区别

Exception.png

本质:

RuntimeException:是不受检查异常,也就是即便不抛也不会出编译错误,虚拟机会自己抛出来,常见的:NullPointerException,ArrayIndexOutOfBoundsException,IllegalArgumentException,在实际编码过程中,你没有抛它也会自己出。

非RuntimeException:受检查异常,就必须要往上抛,否则编译出错。


设计(自定义异常应该继承谁?):

假如说,让你做一个异常的设计,你会怎么设计?

个人理解:

如果是业务上的异常,并且你知道要如何处理这个异常,那么应该extends Exception。

如果是系统异常或者调API的异常,而且这些异常你无法预料也无法去解决,那么就应该extends RuntimeException

换而言之:

继承RuntimeException可以不对异常主动处理,但发生异常时会导致程序终止。

继承Exception必须对异常主动处理,既然已经处理了,就不会导致程序终止。


Spring事务处理机制之RuntimeException()和Exception()区别:

Spring的@Transactional这个注解默认的是Error和Runtimexception才会回滚事务

如果是Exception的话,Spring是不会回滚事务的。

假如说抛Exception想回滚事务应该怎么做?

①:在service层不使用try......catch或者在catch中最后加上throw new RuntimeException(),这样程序异常时aop才可以捕获异常并进行回滚。

最终在service上层(如controller层、action层、view层)要继续捕获这个异常并处理。

②:在service层方法上进行配置,改变默认规则,方法如下 :

(1) 让checked例外也回滚:在整个方法前加上 @Transactional(rollbackFor=Exception.class)

(2)让unchecked例外不回滚: @Transactional(notRollbackFor=RunTimeException.class)

(3)不需要事务管理的(只查询的)方法@Transactional(propagation=Propagation.NOT_SUPPORTED)

在整个方法运行前就不会开启事务还可以加上:@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true),这样就做成一个只读事务,可以提高效率。

目录
相关文章
|
6月前
|
C++
C++异常处理try和throw以及catch的使用
C++异常处理try和throw以及catch的使用
|
6月前
|
监控 Java 程序员
详解Java中的异常体系结构(throw,throws,try-catch,finally,自定义异常)
详解Java中的异常体系结构(throw,throws,try-catch,finally,自定义异常)
148 0
16 # 实现 catch 方法
16 # 实现 catch 方法
55 0
|
消息中间件 Java 中间件
业务中 自定义异常用 Exception 还是 RuntimeException? 为什么?
今天和同事 聊了下异常 相关的事,整理在此 目前公司中使用的 自定义异常是 extend RuntimeException
112 1
|
Java 程序员 编译器
异常(Exception)
异常(Exception)
106 0
异常(Exception)
|
安全 Java 数据库连接
Java中的异常处理详解(try、catch、finally、throw、throws)
Java中的异常处理详解(try、catch、finally、throw、throws)
307 1
|
Java 程序员 编译器
Java异常——throw、throws及自定义异常
Java异常——throw、throws及自定义异常
129 0
|
Java 编译器 API
RuntimeException和Exception比较
RuntimeException和Exception比较
533 0