RuntimeException newExc=new RuntimeException("司机一滴酒,亲人两行泪~") ;
newExc.initCause(e);
和
RuntimeException newExc=new RuntimeException(e) ;
//newExc.initCause(e);
区别在于:这里(new RuntimeException("司机一滴酒,亲人两行泪"))调用了RuntimeException这个新异常的含参构造器,异常打印出来第一行是这样的:java.lang.RuntimeException: 司机一滴酒,亲人两行泪;
而RuntimeException newExc=new RuntimeException(e) 是把捕获的DrunkException e(喝大了异常)传进去,打印出来是这样:java.lang.RuntimeException: com.imooc.test.DrunkException: 喝车别开酒!
相当于上面那个是先抛出RuntimeException这个新异常:"司机一滴酒,亲人两行泪";
而下面那个则是直接把捕获的DrunkException(喝大了异常),即原始异常(test1里抛出的异常),抛出。
两个都是实现了异常链的功能。
我也不是很懂,以上都是个人理解。
仅仅是构造方式的不同,e是异常类型的一个对象,它本身携带着异常形成的原因信息,所以基本上都要通过它来创建一个新的异常,形成所谓的异常链,否则那不是就丢失了起初异常成因的信息了。