public void test2() { try { test1(); } catch (OwnException e) { RuntimeException newExc = new RuntimeException("开车不喝酒"); newExc.initCause(e); throw newExc; } }
问题1、为什么test2后面不加throws
2、test2 为什么既有try catch语句,又有throw 。 根据前面所学,二者选择一个不就好了吗?靠try catch 没法解决吗?那为什么还要抛出?
3、不是应该只输出开车不喝酒吗?为什么连test1中的文字也输出了
我只针对你的第三个问题补充一点,对于异常的处理,并不等于使用System.out.println输出,它只是系统捕获最终异常显示出异常信息而已,它不是输出。
一楼回答的挺好的,我做点补充,对于问题2 二者选一个是try-catch跟throws 不是throw,throw是抛出一个异常,而throws是声明该方法可能存在的异常。对于问题3补充 test1抛出的异常被test2的try-catch捕获这个你应该是知道的。接下来的问题主要是由于 initCause引起的,如果你把initCause这句注释掉,你会发现它并没有输出test1()抛出的异常,而且不注释的情况下抛出的异常信息是以Cause by (导致)开头的,initCause把参数异常放到运行时异常里面,从而知道异常是谁抛出的,可以追溯到源头,具体我也不是很懂这个initCause做了点啥。。
当抛出新异常时,添加throws,throws的作用是声明异常,此处无需再声明
大体上来说此处为捕获异常并处理的方法体。此处catch中RuntimeException将捕获的异常包装成运行时异常,throw语句抛出新异常——运行时异常。
try..catch..语句中 try:调用会抛出异常的方法—test1()方法
catch:处理该异常的代码块
所以会执行test1()方法
语法规则 catch中抛出异常 方法后可不加关键字
try catch 是对程序中的异常捕获并处理,没有要求说处理方式,也没有语法要求说不能抛出异常
text2 调用text1 并捕获text1抛出异常,text2中newExc.initCause(e)语句功能为打印异常信息,注意其有参数 且参数为text1中异常,所以打印出 两句