问答详情
源自:1-7 Java 中的异常链

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

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

提问者:慕媛 2016-02-26 16:10

个回答

  • 未卜先知
    2016-11-21 00:10:23

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

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

  • alwynxu
    2016-04-16 14:21:26

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

  • 愿遂
    2016-03-27 14:11:35

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

  • SHsama
    2016-03-24 22:07:28

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

  • SHsama
    2016-03-24 22:06:33

    都把问题想复杂了,你想啊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. 异常链,就是利用一个抛出来的异常来触发另一个,最后将其抛出来

  • qq_老表_1
    2016-03-05 22:35:40

    和楼主同问,求解答!

  • 慕媛
    2016-03-03 16:58:32

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

  • 飞行烤鸭
    2016-02-26 22:30:58

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

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

  • qq_Say_3
    2016-02-26 20:15:51

    楼上正解

  • java___web
    2016-02-26 18:59:09

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