test1方法不声明,直接throw就会编译不通过。而test2方法调用test1方法,try-catch了,为什么异常还能抛出去?抛出去的时候为什么还不需要throws声明。为什么,为什么呢?
因为这里抛出的是Runtime异常,Runtime异常不需要用throws声明,也不需要try-catch,可以直接throw抛出
jvm会自动处理,见1-1的6分20,不过说的不够详细
运行时异常,不管你抛还是不抛,编译时都是没有问题的,但是如果不是运行时异常就必须采取两种方式解决:一就是接着抛出去,二就是进行try {}catch{}处理
因为test2的throw是放在catch中的,并非放在外面。前面你也看到了,有异常有两种处理方式,一种是声明后抛出,就像test1();另一种就是用try-catch包裹。
说的有点混乱,不知道有没有讲清楚
都把问题想复杂了,你想啊throw是抛出异常,有抛就有接,如果说test1()中只有throw抛出异常而没有被捕获的话编译当然报错,所以在test2()中老师就用try。。catch捕获了test1()抛出的异常“喝车别开酒”,进而利用这个异常来触发另外一个异常(就是所谓的异常链,一个异常导致另一个异常的发生),即“司机一滴酒,亲人两行泪”。那为什么test2没有throws声明,而“throw newExc”却能编译通过。?那是因为test2()调用了test1()中所抛出的异常了,换句话来说就是test2()利用了test1()中的异常了,所以编译能通过啊(注:如果没有调用test1()中的throw抛出的异常的话就不能通过了)。整个过程就是test1()throw一个“喝车不开酒”异常—-——test2()try..catch捕获——>test2()利用捕获的异常来触发另一个异常“司机。。”——>抛出test2()异常
最后总结一下:
有抛就有接,用了throw就要用try。。catch来捕获,否则光throw就会编译不通过
异常链,就是利用一个抛出来的异常来触发另一个,最后将其抛出来
和楼主同问,求解答!
楼上的诸位,我不理解你们的意思。我说的是:test2中利用try-catch捕获了test1的异常并另外包装了一个名叫newExc的异常,而且还throw出去了。我的问题是:为什么test2没有throws声明,而“throw newExc”却能编译通过。?
如果只有test1而没有test2,而且test1只是throw一个异常的话,程序运行肯定会报错。但是这里老师又写了一个test2,test2调用了test1,对test1抛出的异常进行了try-catch,所以能通过。看注释的话也能看得出,亲人两行泪,司机一滴酒这个异常出在喝酒别开车这个地方,也就是test1中这个地方。
语言紊乱,请见谅....
楼上正解
没有使用 throw 所以不需要 throws 用了try catch 解决了