JAVA中try-catch結(jié)構(gòu)之異常處理的使用方法
try-catch
是 Java 和許多其他編程語(yǔ)言中用于異常處理的關(guān)鍵字組合,它允許程序員優(yōu)雅地捕獲和處理運(yùn)行時(shí)可能出現(xiàn)的錯(cuò)誤。以下是 try-catch
結(jié)構(gòu)的詳細(xì)說(shuō)明:
結(jié)構(gòu):
try { // 有可能拋出異常的代碼塊 // 這里可以調(diào)用方法、執(zhí)行操作等 riskyOperation(); } catch (SpecificExceptionType1 e) { // 處理 SpecificExceptionType1 類型異常的代碼塊 // 可以訪問到異常對(duì)象 e,通過 e.getMessage(), e.printStackTrace() 等方法獲取異常信息 System.out.println("Caught Exception Type 1: " + e.getMessage()); } catch (SpecificExceptionType2 e) { // 處理 SpecificExceptionType2 類型異常的代碼塊 System.out.println("Caught Exception Type 2: " + e.getMessage()); } finally { // 無(wú)論是否發(fā)生異常,都會(huì)執(zhí)行的代碼塊 // 通常用于資源清理,如關(guān)閉文件、數(shù)據(jù)庫(kù)連接等 cleanupResources(); }
解釋:
try
塊:包裹可能會(huì)拋出異常的代碼。當(dāng)try
塊中的代碼執(zhí)行時(shí),如果出現(xiàn)了異常(例如除數(shù)為零、文件未找到等),控制權(quán)將立即轉(zhuǎn)到相應(yīng)的catch
塊。catch
塊:每一個(gè)catch
塊都與一個(gè)或一類異常類型相關(guān)聯(lián)。當(dāng)try
塊中的代碼拋出與catch
塊聲明的異常類型相匹配的異常時(shí),與之關(guān)聯(lián)的catch
塊將被執(zhí)行。在catch
塊中,可以訪問到異常對(duì)象,進(jìn)而獲取異常的詳細(xì)信息。finally
塊(可選):無(wú)論try
塊中是否拋出了異常,以及是否有與之匹配的catch
塊,finally
塊中的代碼總會(huì)被執(zhí)行。通常用于資源回收、關(guān)閉打開的文件、數(shù)據(jù)庫(kù)連接等操作,確保無(wú)論程序運(yùn)行結(jié)果如何,都能正確釋放資源。
示例:
try { int denominator = 0; int result = 10 / denominator; // 這將拋出 ArithmeticException } catch (ArithmeticException e) { System.out.println("Divide by zero error occurred: " + e.getMessage()); } finally { System.out.println("Finally block executed."); }
在這個(gè)例子中,嘗試除以零會(huì)拋出 ArithmeticException
,這個(gè)異常會(huì)被相應(yīng)的 catch
塊捕獲并處理,然后執(zhí)行 finally
塊中的代碼。
多重捕捉:
在Java中,可以使用多重 catch
子句來(lái)捕獲不同類型的異常。這樣,可以根據(jù)異常的不同類型執(zhí)行不同的處理邏輯。下面是一個(gè)使用多重 catch
的示例:
try { // 可能拋出多種類型異常的代碼 File file = new File("non_existent_file.txt"); FileReader fr = new FileReader(file); BufferedReader br = new BufferedReader(fr); String line = br.readLine(); } catch (FileNotFoundException e) { // 處理找不到文件異常 System.out.println("File not found: " + e.getMessage()); } catch (IOException e) { // 處理讀取文件時(shí)發(fā)生的其他IO異常,如讀取錯(cuò)誤、緩沖區(qū)溢出等 System.out.println("An IO error occurred: " + e.getMessage()); } finally { // 清理資源,如關(guān)閉文件流 try { if (br != null) { br.close(); } } catch (IOException ex) { System.out.println("Error closing the reader: " + ex.getMessage()); } }
在上述代碼中,try
塊中包含了可能導(dǎo)致 FileNotFoundException
和 IOException
的代碼。當(dāng)出現(xiàn) FileNotFoundException
時(shí),第一個(gè) catch
子句會(huì)被執(zhí)行;如果發(fā)生了 IOException
但不是 FileNotFoundException
(例如讀取過程中出現(xiàn)問題),則第二個(gè) catch
子句會(huì)被執(zhí)行。
需要注意的是,Java 7及更高版本引入了一種更簡(jiǎn)潔的異常處理方式,即使用一個(gè)多異常捕獲的 catch
子句,可以捕獲并處理多種類型的異常,如下所示:
catch (FileNotFoundException | IOException e) { System.out.println("An error occurred: " + e.getMessage()); }
這種方式可以合并處理同類或繼承關(guān)系中的多種異常類型。但是,如果需要針對(duì)每種異常采取不同的處理措施,還是需要分開使用多個(gè) catch
子句。
附:自定義異常
上面提到:如果拋出異常對(duì)象必須是異常類的子類(?throw new String(”ssdf“)),但是現(xiàn)在想自定義一個(gè)怎么辦呢?
1、為什么需要自定義異常類
Java中不同的異常類,分別表示著某一種具體的異常情況。那么在開發(fā)中總是有些異常情況是核心類庫(kù)中沒有定義好的,此時(shí)我們需要根據(jù)自己業(yè)務(wù)的異常情況來(lái)定義異常類。例如年齡負(fù)數(shù)問題,考試成績(jī)負(fù)數(shù)問題,某員工已在團(tuán)隊(duì)中等。——可以通過異常名稱就能直接判斷此異常出現(xiàn)的原因,因此有必要不滿指定條件時(shí),通過此異常類判斷出具體的異常問題
2、如何自定義異常類
- 繼承于現(xiàn)有的異常體系:
java.lang.Exception
、java.lang.RuntimeException
- 通常提供幾個(gè)重載的構(gòu)造器:無(wú)參構(gòu)造、(String message)構(gòu)造器
- 提供一個(gè)全局常量:聲明為static final long serialVersionUID
3、如何使用自定義異常類
- 在具體代碼中,滿足指定條件的情況下,只能手動(dòng)使用"throw 自定義異常類的對(duì)象"方式,將異常對(duì)象拋出【生成異常對(duì)象,手動(dòng)拋】
- 如果是非運(yùn)行時(shí)異常,必須要處理:try-catch、throws
自定義異常類,并手動(dòng)拋出異常對(duì)象→處理異常
//自定義異常類 class MyException extends Exception { static final long serialVersionUID = 23423423435L; private int idnumber; public MyException(String message, int id) { super(message); this.idnumber = id; } public int getId() { return idnumber; } }
public class MyExpTest { public void regist(int num) throws MyException { if (num < 0) throw new MyException("人數(shù)為負(fù)值,不合理", 3);//手動(dòng)拋出異常對(duì)象 else System.out.println("登記人數(shù)" + num); } public void manager() { try { regist(100);//執(zhí)行會(huì)產(chǎn)生異常對(duì)象的代碼,就需要進(jìn)行異常處理 } catch (MyException e) { System.out.print("登記失敗,出錯(cuò)種類" + e.getId()); } System.out.print("本次登記操作結(jié)束"); } public static void main(String args[]) { MyExpTest t = new MyExpTest(); t.manager(); } }
總結(jié)
到此這篇關(guān)于JAVA中try-catch結(jié)構(gòu)之異常處理的使用方法的文章就介紹到這了,更多相關(guān)JAVA try-catch異常處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring AI 使用本地 Ollama Embeddings的操作方法
使用 OpenAI 的 Embeddings 接口是有費(fèi)用的,如果想對(duì)大量文檔進(jìn)行測(cè)試,使用本地部署的 Embeddings 就能省去大量的費(fèi)用,所以我們嘗試使用本地的 Ollama Embeddings,這篇文章主要介紹了Spring AI 使用本地 Ollama Embeddings,需要的朋友可以參考下2024-05-05Java某個(gè)經(jīng)緯度是否在genjson文件中問題
GeoJSON是一種用于地理空間信息數(shù)據(jù)交換的格式,基于JSON,要判斷某個(gè)經(jīng)緯度是否在某個(gè)區(qū)域內(nèi),首先需要解析GeoJSON文件,確定區(qū)域邊界,然后使用經(jīng)緯度進(jìn)行比較2024-11-11SpringBoot執(zhí)行定時(shí)任務(wù)@Scheduled的方法
這篇文章主要介紹了SpringBoot執(zhí)行定時(shí)任務(wù)@Scheduled的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07zuulGateway 通過filter統(tǒng)一修改返回值的操作
這篇文章主要介紹了zuulGateway 通過filter統(tǒng)一修改返回值的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-10-10JAVA系統(tǒng)中Spring?Boot應(yīng)用程序的配置文件application.yml使用詳解
這篇文章主要介紹了JAVA系統(tǒng)中Spring?Boot應(yīng)用程序的配置文件application.yml的相關(guān)資料,application.yml是Spring?Boot應(yīng)用程序的配置文件,定義了服務(wù)器、Spring、日志、安全及其他配置屬性,確保應(yīng)用程序正確啟動(dòng)和運(yùn)行,需要的朋友可以參考下2025-01-01基于Java實(shí)現(xiàn)簡(jiǎn)單的時(shí)序數(shù)據(jù)壓縮算法
這篇文章主要為大家詳細(xì)介紹了如何利用Java語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單易懂的時(shí)序數(shù)據(jù)壓縮算法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-06-06