Java中throw和throws異常處理完整例子說明
前言
簡單來說就是:你用throws不一定會拋出異常,它只是代表這個方法可能拋出這個異常,像打個預(yù)防針一樣;
你要用throw那一定會拋出異常,因為throw是一個行為,代表拋出異常的動作。
一. throw關(guān)鍵字:
1.作用:
throw關(guān)鍵字用于在程序中手動拋出一個異常。當異常發(fā)生時,程序會中斷當前的執(zhí)行流程,并將異常信息傳遞給上層的異常處理機制。
2.使用場景:
(a)當我們發(fā)現(xiàn)某些條件不符合業(yè)務(wù)邏輯要求時,我們可以使用throw關(guān)鍵字拋出一個異常。
(b)當我們在定義自己的異常類時,可以通過throw關(guān)鍵字主動拋出這個自定義的異常對象。
3.代碼示例:
public void checkAge(int age) { if (age < 0) { throw new IllegalArgumentException("年齡不能為負數(shù)"); } }
二. throws關(guān)鍵字:
1.作用:
throws關(guān)鍵字用于指定方法可能拋出的異常。它標識了哪些異常可以傳遞到方法的調(diào)用者,需要調(diào)用者進行相應(yīng)的處理。
2.使用場景:
(a)當方法內(nèi)部的代碼可能會引發(fā)異常時,可以使用throws關(guān)鍵字聲明這些異常。
(b)當我們不希望在當前方法中捕獲異常,并且希望將異常傳遞給上層調(diào)用者來處理時,可以使用throws關(guān)鍵字。
3.代碼示例:
public void readFile() throws IOException { // 異常處理邏輯 }
三. 區(qū)別與聯(lián)系:
throw關(guān)鍵字是用于在方法內(nèi)拋出異常,而throws關(guān)鍵字是在方法聲明中指定可能拋出的異常。
- throw關(guān)鍵字通常用于手動拋出異常,而throws關(guān)鍵字通常用于聲明方法可能拋出的異常。
- throw關(guān)鍵字只能拋出一個異常對象,而throws關(guān)鍵字可以同時指定多個異常。
- throw關(guān)鍵字會中斷當前的執(zhí)行流程,尋找合適的異常處理機制,而throws關(guān)鍵字將異常傳遞給調(diào)用者來處理。
四. 完整的例子說明(1):
下面我們通過一個完整的例子來說明throw和throws的使用:
public class Example { public void divide(int a, int b){ if (b == 0) { throw new ArithmeticException("除數(shù)不能為0"); } int result = a / b; System.out.println("結(jié)果為:" + result); } public static void main(String[] args) { Example example = new Example(); String name = null; try { example.divide(10, 0); String a = ""; System.out.println("name = "+name.length()); //處理除數(shù)異常 } catch (ArithmeticException e) { System.out.println("捕獲到異常:" + e.getMessage()); example.divide(10, 2); //處理空指針異常 } catch (NullPointerException e){ System.out.println("捕獲到異常:" + e.getMessage()); } } }
在上面的例子中,我們定義了一個divide方法,用于計算兩個數(shù)相除的結(jié)果。如果除數(shù)為0,我們通過throw關(guān)鍵字手動拋出一個ArithmeticException異常。在main方法中,我們通過try-catch塊捕獲并處理這個異常。這里通過throws關(guān)鍵字聲明了divide方法可能拋出的異常。在catch塊中,首先捕獲了ArithmeticException類型的異常,并打印異常信息。
緊接著,我們調(diào)用了example的divide方法,傳入?yún)?shù)10和2,這是因為在上一個異常處理后,我們想要繼續(xù)進行除法運算。最后,我們又捕獲了NullPointerException類型的異常,并打印了異常信息。
這段代碼演示了異常的拋出和捕獲過程。當divide方法中的除數(shù)為0時,會拋出ArithmeticException異常,然后在main方法中通過try-catch塊捕獲并處理了這個異常。另外,在處理ArithmeticException異常后,又出現(xiàn)了一個空指針異常,同樣通過try-catch塊進行了處理。這個例子展示了異常的傳播和多重異常處理的過程。
五. 完整的例子說明(2):
上個例子沒看懂,沒關(guān)系,我用這個重新解釋一下。
package org.example; /** * @author 懶魚 * @date 2024/1/3 9:33 */ public class Example { // 這個方法使用 throws 關(guān)鍵字聲明可能拋出的異常。這對于調(diào)用者是一個信號,它們需要準備好處理這些異常。 public void divide(int a, int b) throws ArithmeticException, NullPointerException { int result = a / b; System.out.println("結(jié)果為:" + result); } // 模擬一個操作可能會引發(fā) NullPointerException 的情況 public void process(String name){ System.out.println("name = "+name); throw new NullPointerException("字符串不能為空"); } public static void main(String[] args) { Example example = new Example(); try { example.divide(10, 2); } catch (ArithmeticException e) { System.out.println("divide捕獲到除數(shù)異常:" + e.getMessage()); } catch (NullPointerException e) { System.out.println("divide未執(zhí)行,但可能會拋出的異常類型通過 throws 聲明了"); } // 移到另一個 try-catch 塊,以突出顯示每個方法的異常處理 try { example.process("張三"); } catch (NullPointerException e) { System.out.println("process捕獲到空指針異常:" + e.getMessage()); } } }
打印:
divide方法我用throws 聲明了ArithmeticException, NullPointerExceptio 兩個異常
因為沒有出現(xiàn)異常,所以沒有拋出異常,正常打印出。
而 process 雖然代碼沒問題,但我直接用throw new NullPointerException("字符串不能為空");異常,所以try - cath 就直接捕獲。
所以,就像我一開始說的:你用throws不一定會拋出異常,它只是代表這個方法可能拋出這個異常,像打個預(yù)防針一樣;你要用throw那一定會拋出異常,因為throw是一個行為,代表拋出異常的動作。
附:throw/throws面試題
一、throw 和 throws 關(guān)鍵字有什么區(qū)別?
throw
和throws
關(guān)鍵字都與異常處理有關(guān),但用法和目的不同。throw
關(guān)鍵字用于手動拋出異常,通常用于在代碼中檢測到錯誤或異常情況時中斷當前代碼的執(zhí)行,并將異常對象拋出給調(diào)用者。throws
關(guān)鍵字用于在方法聲明中聲明該方法可能拋出的異常,以便調(diào)用者知道需要對異常進行處理。
二、throw 關(guān)鍵字在什么情況下使用?
throw
關(guān)鍵字用于在代碼中手動拋出異常,通常在檢測到錯誤或異常情況時使用。- 例如當輸入?yún)?shù)非法、資源不可用、網(wǎng)絡(luò)連接斷開等情況下,可以使用
throw
語句拋出相應(yīng)的異常。
三、throws 關(guān)鍵字的作用是什么?
throws
關(guān)鍵字用于在方法聲明中聲明該方法可能拋出的異常。- 它的作用是告訴調(diào)用者需要對可能的異常情況進行處理,要么使用
try-catch
語句塊捕獲并處理異常,要么繼續(xù)將異常向上一級調(diào)用棧傳遞。
四、throw 和 throws 關(guān)鍵字的異常處理方式有什么不同?
throw
關(guān)鍵字用于手動拋出異常,通常在當前代碼中直接處理異常情況。throws
關(guān)鍵字用于聲明方法可能拋出的異常,將異常處理責任交給方法的調(diào)用者。
五、throws 關(guān)鍵字是否要求在方法中實際拋出異常?
- 不一定。
throws
關(guān)鍵字只是在方法聲明中聲明方法可能拋出的異常,但方法內(nèi)部是否實際拋出異常不是強制的。
六、如果一個方法聲明了 throws 異常,那么調(diào)用該方法時怎么處理異常?
- 調(diào)用該方法時,必須對拋出的異常進行處理,要么使用
try-catch
語句塊捕獲并處理異常,要么在方法調(diào)用處的上層調(diào)用棧中繼續(xù)使用throws
關(guān)鍵字聲明可能的異常。
總結(jié):
本篇博客詳細講解了throw和throws這兩個關(guān)鍵字的使用,以及它們之間的區(qū)別。throw關(guān)鍵字用于手動拋出異常,而throws關(guān)鍵字用于聲明方法可能拋出的異常。它們都有助于編寫更加健壯的異常處理代碼。希望通過這篇博客,讀者能更好地掌握這兩個關(guān)鍵字的用法,并在實際編程中靈活運用。
到此這篇關(guān)于Java中throw和throws異常處理的文章就介紹到這了,更多相關(guān)Java異常處理throw和throws內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決springMVC 跳轉(zhuǎn)js css圖片等靜態(tài)資源無法加載的問題
下面小編就為大家?guī)硪黄鉀QspringMVC 跳轉(zhuǎn)js css圖片等靜態(tài)資源無法加載的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10解決mybatis-plus-boot-starter與mybatis-spring-boot-starter的錯誤問題
本文主要講述了在使用MyBatis和MyBatis-Plus時遇到的綁定異常問題,通過排查和總結(jié),作者發(fā)現(xiàn)使用MyBatis-Plus?Boot?Starter可以解決這個問題,文章詳細對比了MyBatis-Plus?Boot?Starter和MyBatis?Spring?Boot?Starter的功能和使用場景2025-01-01java中break和continue區(qū)別及使用場合分析
本文力圖通過實例加使用場合詳解來引導(dǎo)菜鳥重新認識break和continue語句,需要的朋友可以參考下2014-01-01Java畢業(yè)設(shè)計實戰(zhàn)之校園一卡通系統(tǒng)的實現(xiàn)
這是一個使用了java+Springboot+Maven+mybatis+Vue+mysql+wd開發(fā)的校園一卡通系統(tǒng),是一個畢業(yè)設(shè)計的實戰(zhàn)練習,具有校園一卡通系統(tǒng)該有的所有功能,感興趣的朋友快來看看吧2022-01-01修改idea的這些啟動參數(shù),令你的idea健步如飛
這篇文章主要介紹了修改idea的這些啟動參數(shù),令你的idea健步如飛~具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01在CentOS系統(tǒng)上安裝Java?JDK?8簡單步驟
最近購買一臺新的云服務(wù)器,用于開發(fā)學習使用,因此需要安裝很多的組件,下面這篇文章主要給大家介紹了關(guān)于在CentOS系統(tǒng)上安裝Java?JDK8的簡單步驟,需要的朋友可以參考下2023-12-12關(guān)于Java的Condition接口最佳理解方式
這篇文章主要介紹了關(guān)于Java的Condition接口最佳理解方式,Condition就是實現(xiàn)了管程里面的條件變量,Java?語言內(nèi)置的管程里只有一個條件變量,而Lock&Condition實現(xiàn)的管程支持多個條件變量,需要的朋友可以參考下2023-05-05