看似简单的问题往往都不能给出准确的答案,在开发中经常会遇到异常处理的问题,可真的知道Exception到底该怎么用,不同的Exception又存在什么区别呢?
checkedException必须被显式地捕获try-catch-finally,而uncheckedException则可以不必捕获或抛出。
checkedException继承java.lang.Exception类。uncheckedException继承自java.lang.RuntimeException类。
对比一下CheckedException和RuntimeException:
在java的异常类体系中,Error和RuntimeException是非检查型异常,其他的都是检查型异常:
1.所有方法都可以在不声明throws的情况下抛出RuntimeException及其子类
2.CheckedException一定需要声明才能抛出,即一定要写throws XXXException才能抛出。
为了验证上面的说法,先分别创建两个不同的异常:
在异常创建完之后在Test类中使用这两个异常:
在方法中调用这两个个分别抛出CheckedException和RuntimeException的方法:
发现CheckedException在没有try catch捕获的语句包括下会有语法错误,而RuntimeException则没有,这个就和先前讲的RunTimeException和CheckedException的特性有关系了,这两种Exception从名字上看就能看出来,一个是运行时抛出,一个是要检查的异常,因此java规定,RuntimeException即使主动抛出,也不必用try catch包括,将异常交由JVM处理,即没有强制要求捕获该异常。
而CheckedException则不同,如果抛出的是CheckedException异常则强制规定需要try catch捕获。
以往我都是应用checkedException多于uncheckedException,
如果客户端可以通过其他的方法恢复异常,那么这种异常就是checked exception;如果客户端对出现的这种异常无能为力,那么这种异常就是uncheckedException。这是简单的在编程的过程中选择到底使用哪种异常的依据。
另外多提一句,spring的AOP事务管理默认是针对
unchecked exception
(未捕获的RuntimeException)回滚。就是说在默认情况下,如果抛出的是checkedException
那么即使整个逻辑是在spring 事务的范围内,也不会进行回滚。 ( spring aop 异常捕获原理:被拦截的方法需显式抛出异常,并不能经任何处理,这样aop代理才能捕获到方法的异常,才能进行回滚,默认情况下aop只捕获runtimeexception的异常,但可以通过配置来捕获特定的异常并回滚,换句话说在service的方法中不使用try catch 或者在catch中最后加上throw new runtimeexcetpion()
,这样程序异常时才能被aop捕获进而回滚这样设计的目的应该也和这两种异常的使用不同(checkedException可以通过其他方法恢复异常)有关。