异常嵌套在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这种关键字,因为一旦出异常会把前面的异常信息都吞掉,到时候你根本就不知道是什么原因造成的。