課程
/后端開發
/Java
/Java入門第三季
test1方法不聲明,直接throw就會編譯不通過。而test2方法調用test1方法,try-catch了,為什么異常還能拋出去?拋出去的時候為什么還不需要throws聲明。為什么,為什么呢?
2016-02-26
源自:Java入門第三季 1-7
正在回答
因為這里拋出的是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()利用捕獲的異常來觸發另一個異?!八緳C。。”——>拋出test2()異常
最后總結一下:
有拋就有接,用了throw就要用try。。catch來捕獲,否則光throw就會編譯不通過
異常鏈,就是利用一個拋出來的異常來觸發另一個,最后將其拋出來
divinginjava
SHsama 回復 divinginjava
和樓主同問,求解答!
樓上的諸位,我不理解你們的意思。我說的是:test2中利用try-catch捕獲了test1的異常并另外包裝了一個名叫newExc的異常,而且還throw出去了。我的問題是:為什么test2沒有throws聲明,而“throw newExc”卻能編譯通過。?
ting0fdnb
愿遂
慕函數9564060 回復 ting0fdnb
如果只有test1而沒有test2,而且test1只是throw一個異常的話,程序運行肯定會報錯。但是這里老師又寫了一個test2,test2調用了test1,對test1拋出的異常進行了try-catch,所以能通過??醋⑨尩脑捯材芸吹贸?,親人兩行淚,司機一滴酒這個異常出在喝酒別開車這個地方,也就是test1中這個地方。
語言紊亂,請見諒....
樓上正解
沒有使用 throw ?所以不需要 throws ? 用了try catch ?解決了
舉報
Java中你必須懂得常用技能,不容錯過的精彩,快來加入吧
2 回答聲明拋出異常為什么還會出錯
3 回答請問test2() throw 的RuntimeException 為什么不需要test2() throws Exception 聲明拋出異常?
3 回答關于test2()方法拋出異常的問題
4 回答test2中throw了一個RunTimeException異常,為什么方法名后面沒有throws聲明
3 回答拋出異常編譯問題
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網安備11010802030151號
購課補貼聯系客服咨詢優惠詳情
慕課網APP您的移動學習伙伴
掃描二維碼關注慕課網微信公眾號
2016-11-21
因為這里拋出的是Runtime異常,Runtime異常不需要用throws聲明,也不需要try-catch,可以直接throw拋出
jvm會自動處理,見1-1的6分20,不過說的不夠詳細
2016-04-16
運行時異常,不管你拋還是不拋,編譯時都是沒有問題的,但是如果不是運行時異常就必須采取兩種方式解決:一就是接著拋出去,二就是進行try {}catch{}處理
2016-03-27
因為test2的throw是放在catch中的,并非放在外面。前面你也看到了,有異常有兩種處理方式,一種是聲明后拋出,就像test1();另一種就是用try-catch包裹。
2016-03-24
說的有點混亂,不知道有沒有講清楚
2016-03-24
都把問題想復雜了,你想啊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()異常
最后總結一下:
有拋就有接,用了throw就要用try。。catch來捕獲,否則光throw就會編譯不通過
異常鏈,就是利用一個拋出來的異常來觸發另一個,最后將其拋出來
2016-03-05
和樓主同問,求解答!
2016-03-03
樓上的諸位,我不理解你們的意思。我說的是:test2中利用try-catch捕獲了test1的異常并另外包裝了一個名叫newExc的異常,而且還throw出去了。我的問題是:為什么test2沒有throws聲明,而“throw newExc”卻能編譯通過。?
2016-02-26
如果只有test1而沒有test2,而且test1只是throw一個異常的話,程序運行肯定會報錯。但是這里老師又寫了一個test2,test2調用了test1,對test1拋出的異常進行了try-catch,所以能通過??醋⑨尩脑捯材芸吹贸?,親人兩行淚,司機一滴酒這個異常出在喝酒別開車這個地方,也就是test1中這個地方。
語言紊亂,請見諒....
2016-02-26
樓上正解
2016-02-26
沒有使用 throw ?所以不需要 throws ? 用了try catch ?解決了