java嵌套异常_java异常嵌套和异常吞噬

异常嵌套在spring开发中经常遇到,比如页面500,查看控制台发现连续出现好几个异常,按理说一般开发中遇到出现一个异常直接抛出后只会打印该异常出现的原因。查看Exception类源码后,看到一个构造方法,Exception(String msg,Throwable e);这个方法的注释为:Constructs a new exception with the specified detail message and cause.翻译一下用指定的细节信息和原因构造一个新的异常。

看如下代码,在try块里创建3个异常,第二个异常包裹第一个异常,第三个异常包裹第二个异常然后抛出,catch块里再用一个运行时异常包裹第三个异常。

public class NestException {

public static void main(String[] args) {

createException();

}

public static void createException(){

try {

RuntimeException nullPointerException = new RuntimeException("空指针异常1");

RuntimeException nullPointerException2 = new RuntimeException("空指针异常2",nullPointerException);

RuntimeException nullPointerException3 = new RuntimeException("空指针异常3",nullPointerException2);

throw nullPointerException3;

} catch (Exception e) {

throw new RuntimeException("运行异常", e);

}

}

}

执行main方法后,可以看到控制台打印信息

Exception in thread "main" java.lang.RuntimeException: 运行异常

at com.wyk.jdk.exception.NestException.createException(NestException.java:16)

at com.wyk.jdk.exception.NestException.main(NestException.java:6)

Caused by: java.lang.RuntimeException: 空指针异常3

at com.wyk.jdk.exception.NestException.createException(NestException.java:13)

... 1 more

Caused by: java.lang.RuntimeException: 空指针异常2

at com.wyk.jdk.exception.NestException.createException(NestException.java:12)

... 1 more

Caused by: java.lang.RuntimeException: 空指针异常1

at com.wyk.jdk.exception.NestException.createException(NestException.java:11)

... 1 more

由于main方法里没有对异常进行处理,异常被抛给更高层。最后打印结果是把所有嵌套的异常信息都输出了。从这个小程序可以看到异常嵌套的作用

再看一个吞噬异常的程序

public class NestException {

public static void main(String[] args) {

createException();

}

public static void createException(){

try {

RuntimeException nullPointerException = new RuntimeException("空指针异常1");

RuntimeException nullPointerException2 = new RuntimeException("空指针异常2",nullPointerException);

RuntimeException nullPointerException3 = new RuntimeException("空指针异常3",nullPointerException2);

throw nullPointerException3;

} catch (Exception e) {

throw new RuntimeException("运行异常", e);

}finally{

throw new RuntimeException("运行异常2");

}

}

}

输出结果是

Exception in thread "main" java.lang.RuntimeException: 运行异常3

at com.wyk.jdk.exception.NestException.createException(NestException.java:18)

at com.wyk.jdk.exception.NestException.main(NestException.java:6)

程序只抛出了运行异常2异常,也就是说finally块里最好不要用return或者throw这种关键字,因为一旦出异常会把前面的异常信息都吞掉,到时候你根本就不知道是什么原因造成的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值