Test2()的異常問題
public?void?test2()?{ ????try?{ ????????test1(); ?????????}?catch?(OwnException?e)?{ ?????????????RuntimeException?newExc?=?new?RuntimeException("開車不喝酒"); ?????????????newExc.initCause(e); ?????????????throw?newExc; ?????????} }
問題1、為什么test2后面不加throws
????? ? 2、test2 為什么既有try catch語句,又有throw 。 根據前面所學,二者選擇一個不就好了嗎?靠try catch 沒法解決嗎?那為什么還要拋出?
????????3、不是應該只輸出開車不喝酒嗎?為什么連test1中的文字也輸出了
2019-02-14
我只針對你的第三個問題補充一點,對于異常的處理,并不等于使用System.out.println輸出,它只是系統捕獲最終異常顯示出異常信息而已,它不是輸出。
2018-12-24
一樓回答的挺好的,我做點補充,對于問題2 二者選一個是try-catch跟throws 不是throw,throw是拋出一個異常,而throws是聲明該方法可能存在的異常。對于問題3補充 test1拋出的異常被test2的try-catch捕獲這個你應該是知道的。接下來的問題主要是由于 initCause引起的,如果你把initCause這句注釋掉,你會發現它并沒有輸出test1()拋出的異常,而且不注釋的情況下拋出的異常信息是以Cause by (導致)開頭的,initCause把參數異常放到運行時異常里面,從而知道異常是誰拋出的,可以追溯到源頭,具體我也不是很懂這個initCause做了點啥。。
2018-08-29
當拋出新異常時,添加throws,throws的作用是聲明異常,此處無需再聲明
大體上來說此處為捕獲異常并處理的方法體。此處catch中RuntimeException將捕獲的異常包裝成運行時異常,throw語句拋出新異常——運行時異常。
try..catch..語句中 try:調用會拋出異常的方法—test1()方法
? ? ? ? ? ? ? ? ? ? ? ? ? catch:處理該異常的代碼塊
? ?所以會執行test1()方法
2018-08-29
語法規則 catch中拋出異常 ?方法后可不加關鍵字
?try ?catch 是對程序中的異常捕獲并處理,沒有要求說處理方式,也沒有語法要求說不能拋出異常
text2 ?調用text1 并捕獲text1拋出異常,text2中newExc.initCause(e)語句功能為打印異常信息,注意其有參數 且參數為text1中異常,所以打印出 兩句