为了账号安全,请及时绑定邮箱和手机立即绑定

test2方法没有声明异常抛出,为什么编译器还能通过?

test1方法不声明,直接throw就会编译不通过。而test2方法调用test1方法,try-catch了,为什么异常还能抛出去?抛出去的时候为什么还不需要throws声明。为什么,为什么呢?

正在回答

10 回答

因为这里抛出的是Runtime异常,Runtime异常不需要用throws声明,也不需要try-catch,可以直接throw抛出

jvm会自动处理,见1-1的6分20,不过说的不够详细

0 回复 有任何疑惑可以回复我~

运行时异常,不管你抛还是不抛,编译时都是没有问题的,但是如果不是运行时异常就必须采取两种方式解决:一就是接着抛出去,二就是进行try {}catch{}处理

0 回复 有任何疑惑可以回复我~

因为test2的throw是放在catch中的,并非放在外面。前面你也看到了,有异常有两种处理方式,一种是声明后抛出,就像test1();另一种就是用try-catch包裹。

0 回复 有任何疑惑可以回复我~

说的有点混乱,不知道有没有讲清楚

0 回复 有任何疑惑可以回复我~

都把问题想复杂了,你想啊throw是抛出异常,有抛就有接,如果说test1()中只有throw抛出异常而没有被捕获的话编译当然报错,所以在test2()中老师就用try。。catch捕获了test1()抛出的异常“喝车别开酒”,进而利用这个异常来触发另外一个异常(就是所谓的异常链,一个异常导致另一个异常的发生),即“司机一滴酒,亲人两行泪”。那为什么test2没有throws声明,而“throw newExc”却能编译通过。?那是因为test2()调用了test1()中所抛出的异常了,换句话来说就是test2()利用了test1()中的异常了,所以编译能通过啊(注:如果没有调用test1()中的throw抛出的异常的话就不能通过了)。整个过程就是test1()throw一个“喝车不开酒”异常—-——test2()try..catch捕获——>test2()利用捕获的异常来触发另一个异常“司机。。”——>抛出test2()异常

最后总结一下:

  1. 有抛就有接,用了throw就要用try。。catch来捕获,否则光throw就会编译不通过

  2. 异常链,就是利用一个抛出来的异常来触发另一个,最后将其抛出来

2 回复 有任何疑惑可以回复我~
#1

divinginjava

正如你所说 有抛就有接 那最后抛出去的test2()的newExc异常又被谁接去了呢?
2016-04-25 回复 有任何疑惑可以回复我~
#2

SHsama 回复 divinginjava

20哪里不就有么,而且要说明的是当抛出的异常没人接的时候异常会往上层传递
2016-04-26 回复 有任何疑惑可以回复我~
#3

SHsama 回复 divinginjava

诶,前面的话怎么没显示出来,前面掉了Java1-7异常链的四分二十秒
2016-04-26 回复 有任何疑惑可以回复我~

和楼主同问,求解答!

0 回复 有任何疑惑可以回复我~

楼上的诸位,我不理解你们的意思。我说的是:test2中利用try-catch捕获了test1的异常并另外包装了一个名叫newExc的异常,而且还throw出去了。我的问题是:为什么test2没有throws声明,而“throw newExc”却能编译通过。?

2 回复 有任何疑惑可以回复我~
#1

ting0fdnb

找到了解释: 当你把一个异常定义在方法的throws定义中,你就可以不处理这个异常,系统会自动把该异常抛出。 而RuntimeException则是java设计中所有方法都默认定义在throws中了,所以只要你不捕获,就会一层一层的往上抛出。 除非你显示的标准要捕获它。否则不会被捕获。也不会造成编译异常。 其实大部分的RuntimeException,要么是系统异常。无法处理。例如网络问题。 要么就是应该在UT中发现的,例如空指针异常。
2016-03-10 回复 有任何疑惑可以回复我~
#2

愿遂

因为test2的throw是放在catch中的,并非放在外面。前面你也看到了,有异常有两种处理方式,一种是声明后抛出,就像test1();另一种就是用try-catch包裹。
2016-03-27 回复 有任何疑惑可以回复我~
#3

慕函数9564060 回复 ting0fdnb

如果把Test2()中的RuntimeException改成Exception是会报错的;感觉哥们的解释有道理
2016-04-25 回复 有任何疑惑可以回复我~
查看1条回复

如果只有test1而没有test2,而且test1只是throw一个异常的话,程序运行肯定会报错。但是这里老师又写了一个test2,test2调用了test1,对test1抛出的异常进行了try-catch,所以能通过。看注释的话也能看得出,亲人两行泪,司机一滴酒这个异常出在喝酒别开车这个地方,也就是test1中这个地方。

语言紊乱,请见谅....

0 回复 有任何疑惑可以回复我~

楼上正解

0 回复 有任何疑惑可以回复我~

没有使用 throw  所以不需要 throws   用了try catch  解决了

1 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

test2方法没有声明异常抛出,为什么编译器还能通过?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信