亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

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()利用捕獲的異常來觸發另一個異?!八緳C。。”——>拋出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

同求解答
2016-03-10 回復 有任何疑惑可以回復我~
#2

ting0fdnb

找到了解釋: 當你把一個異常定義在方法的throws定義中,你就可以不處理這個異常,系統會自動把該異常拋出。 而RuntimeException則是java設計中所有方法都默認定義在throws中了,所以只要你不捕獲,就會一層一層的往上拋出。 除非你顯示的標準要捕獲它。否則不會被捕獲。也不會造成編譯異常。 其實大部分的RuntimeException,要么是系統異常。無法處理。例如網絡問題。 要么就是應該在UT中發現的,例如空指針異常。
2016-03-10 回復 有任何疑惑可以回復我~
#3

愿遂

因為test2的throw是放在catch中的,并非放在外面。前面你也看到了,有異常有兩種處理方式,一種是聲明后拋出,就像test1();另一種就是用try-catch包裹。
2016-03-27 回復 有任何疑惑可以回復我~
#4

慕函數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下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號