總結來說,throw
是用來丟擲一個具體的異常例項,而throws
是用來宣告方法可能會丟擲哪些型別的異常,是對呼叫者的一種通知和要求。
1. throw
- 作用:
throw
關鍵字用於在方法體內實際丟擲一個異常例項。當程式執行到throw
語句時,指定的異常會被建立並丟擲,立即終止當前方法的執行,並將控制權轉移給包含該方法的呼叫者的異常處理機制。 - 使用時機: 當檢測到某種錯誤條件或異常情況時,在方法內部使用
throw
來丟擲一個異常物件,這個物件可以是系統預定義的異常類的例項,也可以是自定義異常類的例項。 - 特點:
throw
總是伴隨著一個異常例項,且其後的程式碼不會被執行,因為一旦丟擲異常,當前的程式碼路徑就會被中斷。
2. throws
- 作用:
throws
關鍵字用於宣告方法可能丟擲的異常型別,它出現在方法簽名之後。這告知呼叫者該方法執行時可能會遇到的異常情況,要求呼叫者要麼處理這些異常(使用try-catch
語句塊),要麼繼續向上層方法丟擲這些異常。 - 使用時機: 當一個方法無法處理或不打算處理某些異常時,可以在方法宣告中使用
throws
來宣告這些異常。這樣做可以強制呼叫者意識到潛在的異常風險並做出相應的處理準備。 - 特點:
throws
後面可以跟隨一個或多個異常類名,用逗號分隔,表示該方法可能丟擲多種型別的異常。並且,throws
宣告並不意味著異常一定會被丟擲,它只是宣告瞭一種可能性。
3. 為什麼有時候異常必須用throws宣告而有時候不用?
如圖
(圖一)
(圖二)
為什麼會出現這種情況呢?其實瞭解過Java異常的人都知道,異常分為兩大類,一類是執行時異常,一類是非執行時異常。執行時異常只能在執行時識別,所以編譯器無法識別執行時異常,就算不throws出異常也是能編譯透過的,而非執行時異常如果不throws出來,編譯器就會識別到並報錯。