Exception異常機制詳細講解

目錄

  • 一、異常
    • 1.1 什么是異常
    • 1.2 異常機制的作用
    • 1.3 常見的異常
    • 2.3 異常的分類
      • 1. Error
      • 2. Exception
      • ① 運行時異常
      • ② 編譯期異常
      • 總結:
  • 二、異常的處理
    • 2.1 拋出異常
    • 3.1 拋出異常語法
    • 3.2 試圖捕獲異常
    • 3.3 捕獲異常與拋出異常的區別
      • 1. 拋出異常
      • 2.捕獲異常
  • 三、finally
  • 四、throw 異常的產生(創建)
  • 四、異常類的API
  • 五、自定義異常
    • 最后

一、異常

1.1 什么是異常

  • 異常(exception),就是程序中出現的錯誤
  • 就好比你在工作的時候,突然家里出了點情況,中斷了你工作,這就是出現了異常情況。

1.2 異常機制的作用

  • 通過打印出的異常信息,我們可以知道是哪里的代碼出現了問題,并大概了解為什么會出現這個問題,方便我們去解決問題

1.3 常見的異常

  • 算術異常 ArithmeticException

  • 數組下標越界異常 ArrayIndexOutOfBoundsException

  • 空指針異常 NullPointerException

  • 類轉換異常ClassCastException

  • 解析異常 ParseException

  • 堆棧內存溢出錯誤 StackOverflowError

2.3 異常的分類

  • 異常也是一種類,Throwable 類是 Java 語言中所有錯誤或異常的超類。

1. Error

  • Error 是 Throwable 的子類,用于指示合理的應用程序不應該試圖捕獲的嚴重問題。
  • 也就是Error一般都是嚴重問題,遇到必須里面立馬解決,所以不應該捕獲…
  • 例如:堆棧內存溢出錯誤 StackOverflowError

2. Exception

可以拋出,也可以捕獲的異常

Exception子類:RuntimeException(運行時異常)和其他異常類

① 運行時異常

  • 這些異常在編譯時不強制要求處理,通常是由程序中的錯誤引起的,例如 NullPointerException、ArrayIndexOutOfBoundsException 等,這類異常可以選擇處理,但并非強制要求。

在這里插入圖片描述

  • 這些類是: RuntimeException及其子類的都是運行時異常

在這里插入圖片描述

② 編譯期異常

  • 編譯期異常是用戶錯誤或問題引起的異常,這些異常在編譯時強制要求程序員處理。例如要打開一個不存在文件時,一個異常就發生了,這些異常在編譯時不能被簡單地忽略。

在這里插入圖片描述

總結:

Throwable
Error
Exception
驗證問題,不能捕獲,只能拋出
運行時異常
編譯期異常
是RuntimeException的子類
默認不用處理
除了RuntimeException的子類的都是
必須強制處理

二、異常的處理

我們知道異常的基本概念了,那異常如何處理呢?

  • 異常的處理只有兩種方式

    • 拋出異常
    • 捕獲異常

2.1 拋出異常

  • 什么是拋出異常?

    目前為止任何異常,默認的處理方式都是拋出

    所謂拋出異常就是直接將錯誤信息打印到控制臺
    在這里插入圖片描述

3.1 拋出異常語法

  • 前面講到運行時異常,可以不用處理,通過上圖也發現系統會默認自動拋出
  • 如果是編譯期異常,想要拋出異常,語法是
    • 位置: 在方法參數列表后,{}前
    • 寫:throws 異常類名,類名2,…
    public static void main(String[] args) throws ArithmeticException,ArrayIndexOutOfBoundsException {}
  • 聲明拋出異常后,什么效果?
  • 如果代碼一切正常,雖然聲明的有拋出異常,也不會在控制臺打印異常信息
  • 如果代碼真的有異常,聲明了拋出異常,
    • 1錯誤信息就會在控制臺打印
    • 2拋出異常后,后續代碼不再執行
    // 以下代碼中19行報錯,4,5,6,7.7都不再執行public static void main(String[] args) {System.out.println(0.0 );m1();System.out.println(7.7 );}public static void m1() {System.out.println(1);System.out.println(2);m2();System.out.println(5);System.out.println(6);}public static void m2(){System.out.println(3);System.out.println(4 / 0);System.out.println(4 );}
  • 但是如果方法拋出的是編譯期異常,誰調用這個拋出編譯期異常的方法,那么哪個方法就得處理!!

在這里插入圖片描述

  • 特殊的 ,關于拋出異常在重寫方法時也有要求…
  • 子類的重寫后,方法拋出的異常范圍要 <= 父類的異常范圍
  • 特殊的,如果父類方法沒有拋出異常,那么子類方法內有異常也不能拋出,只能捕獲

總結拋出異常

  • 哪里拋出的?
    • 方法簽名上只是聲明可能拋出的異常類型
    • 方法體內,執行到某一行代碼,如果有錯才會拋出
  • 拋給誰?
    • 如果有異常拋出,誰調用拋給哪個方法
    • 最終拋出到main
    • main方法拋出到jvm,jvm打印到控制臺
  • 拋到哪?
    • 拋出到控制臺
  • 拋出了啥?
    • 異常的線程信息
    • 異常類型
    • 異常原因
    • 異常位置

3.2 試圖捕獲異常

試圖捕獲(try-catch)

  • 語法
try{// 可能會有報錯的代碼
} catch (異常類名 對象名){// 如果抓到異常,執行這里
}

執行流程:

  • 代碼正常運行,執行try后
  • 進入try執行,如果try內一切正常,catch就跳過不執行
  • 如果try內有異常
    • try內異常處后續不執行
    • catch捕獲到異常后,就會執行
  • 無論try內有無異常,try-catch后的代碼都能運行
    public static void main(String[] args) {System.out.println(1);System.out.println(2);try {System.out.println(3);System.out.println(4.1);System.out.println(4/0);System.out.println(4.2);}catch (ArithmeticException ae){System.out.println("捕獲到了異常:"+ae );}System.out.println(5);}
  • 特殊情況1: 出現的異常和捕獲的異常不一致,try-catch失效

在這里插入圖片描述

  • 特殊情況2: 允許同時聲明catch多個異常

在這里插入圖片描述

  • 特殊情況3: 如果真需要catch寫多個異常,用于去捕獲多種異常的話,建議這么寫,寫一個Exception,直接捕獲最大類異常,這樣所有異常子類都可以捕獲

image-20240603114043937

3.3 捕獲異常與拋出異常的區別

1. 拋出異常

在這里插入圖片描述

通過上圖發現程序中斷,后續代碼無法執行

2.捕獲異常

在這里插入圖片描述

通過上圖發現,當try代碼塊中出現異常后,catch代碼塊捕獲到異常,執行catch中的語句,而且try-catch外面的語句正常執行

三、finally

  • finally配合try-catch使用
  • 作用: 最終一定會執行,即放在finally里面的代碼,之前無論有無報錯,無論是拋出還是捕獲,fianlly里面的代碼最終一定能執行

語法:

try{// ...
}catch(Exception e){}finally{}

或者

try{// ...   
}finally{}

finally一般用在 關閉流/通道的場景中,用于及時釋放資源

例如: IO流,jdbc連接

四、throw 異常的產生(創建)

  • 之前說的是拋出異常,捕獲異常都是異常出現了之后的解決方案.

如何制造產生異常呢?

產生異常,兩個步驟:

  • 創建異常對象
  • 通過throw 拋出異常對象
    • 需要注意,throw拋出的是編譯期異常,需要強制處理
    • throw拋出的是運行時異常,可以默認不用處理

public class Demo5 {public static void main(String[] args) throws ParseException {String s = parseBirthday2("41011120240101123");System.out.println(s );}/**需求: 解析身份證號中的生日,要求身份證號長度18位,否則拋出異常*/public static String parseBirthday(String idNumber) throws ParseException{if (idNumber.length() == 18) {return idNumber.substring(6,14);}// 拋出異常(編譯期異常,需要處理)throw new ParseException("生日解析出錯,格式不正確",1);}public static String parseBirthday2(String idNumber) {if (idNumber.length() == 18) {return idNumber.substring(6,14);}// 拋出異常(運行時異常,不用管)throw new RuntimeException("2222生日解析出錯,格式不正確");}
}
  • 總結throw和throws…
throwthrows
位置方法體內方法簽名上
后面寫什么跟1個異常對象跟異常類名,且允許多個
作用一定會拋出異常的聲明拋出的異常類型,但是不一定有異常

四、異常類的API

查閱API,發現所有異常,方法基本上都直接繼承自Throwable類,常用的方法

  • 構造方法 Throwable(String message)
    • 所有的異常對象,都通過有參構造將異常信息傳遞給Throwable父類
    • 且這個message就是異常信息
  • String getMessage()
  • void printStackTrace()
  • String toString()
public class Demo6 {public static void main(String[] args) {try {System.out.println(1/0 );}catch (ArithmeticException ae) {// String message = ae.getMessage( );// System.out.println("message = " + message);//// String string = ae.toString( );// System.out.println("string = " + string);// 獲得這些異常信息,將來將其輸出到本地磁盤日志文件ae.printStackTrace();}}
}

五、自定義異常

自定義異常實現步驟

  1. 創建一個異常類,命名規范XxxxException
  2. 繼承一個合適的父類
    1. 繼承編譯期異常
    2. 繼承運行時異常
  3. 設計一個有參構造,將異常信息參數通過super傳遞給父類異常

如何使用自定義異常類:

  • 在需要使用的方法內部,通過throw+該異常對象,將其拋出

// 異常類

public class AgeOutOfBoundsException extends Exception{public AgeOutOfBoundsException(String msg){super(msg);}}

// 使用異常

public class Dog {private int age;public int getAge() {return age;}public void setAge(int age) throws Exception{if (age <= 0 || age >= 100) {throw  new AgeOutOfBoundsException("年齡"+age+"越界!");}this.age = age;}
}

最后

如果感覺有收獲的話,點個贊 👍🏻 吧。
??????本人菜鳥修行期,如有錯誤,歡迎各位大佬評論批評指正!😄😄😄

💘💘💘如果覺得這篇文對你有幫助的話,也請給個點贊、收藏下吧,非常感謝!👍 👍 👍在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/22216.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/22216.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/22216.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring Cloud:構建高可用分布式系統的利器

摘要&#xff1a;本文將介紹Spring Cloud&#xff0c;一個基于Spring Boot的開源微服務架構工具集。我們將探討Spring Cloud的核心組件、特性以及如何使用Spring Cloud構建高可用、分布式系統。通過本文&#xff0c;讀者將了解到Spring Cloud在實現微服務架構中的應用和優勢。 …

【Springcloud微服務】MybatisPlus下篇

&#x1f525; 本文由 程序喵正在路上 原創&#xff0c;CSDN首發&#xff01; &#x1f496; 系列專欄&#xff1a;Springcloud微服務 &#x1f320; 首發時間&#xff1a;2024年6月4日 &#x1f98b; 歡迎關注&#x1f5b1;點贊&#x1f44d;收藏&#x1f31f;留言&#x1f43…

24、matlab二維和三維網格(meshgrid函數)以及散點數據插值 griddata()函數

1、二維和三維網格(meshgrid函數) 語法 語法1:[X,Y] = meshgrid(x,y) 基于向量 x 和 y 中包含的坐標返回二維網格坐標。 語法2:[X,Y] = meshgrid(x) 與 [X,Y] = meshgrid(x,x) 相同,并返回網格大小為 length(x)length(x) 的方形網格坐標。 語法3:[X,Y,Z] = meshgrid(x,y,…

汽車銷售門店零售價格違規檢查的實踐經驗方法

隨著汽車市場的蓬勃發展&#xff0c;汽車銷售門店的零售價格合規性日益受到業界和消費者的關注。為確保銷售過程的公平與透明&#xff0c;開展零售價格違規檢查顯得尤為重要。 在這方面&#xff0c;深圳神秘顧客&#xff08;SMS&#xff09;公司憑借其深厚的實踐經驗和專業技巧…

弘君資本炒股開戶:如何看待股價波動?

在股票商場上股價的動搖無疑是投資者最為關心的話題之一&#xff0c;面臨股價的起伏不定投資者往往會感到迷茫和焦慮。關于怎么看待股價動搖&#xff0c;弘君資本下面就為大家詳細介紹一下。 股價動搖是股市運行的常態&#xff0c;股市是國民經濟的晴雨表&#xff0c;股票價格…

Flink run 自動化運行任務shell腳本

Linux命令行&#xff1a; sh flink_run.sh test com.dzj.app.base.test.FlinkKafkaOffsetTest /root/soft/test.jar flink_run.sh腳本內容&#xff1a; #!/bin/bash# 檢查參數數量是否正確 if [ "$#" -ne 3 ]; thenecho "錯誤&#xff1a;需要提供 3 個參數&…

SpringBoot+layui實現Excel導入操作

excel導入步驟 第三方插件引入插件 效果圖 &#xff08;方法1&#xff09;代碼實現&#xff08;方法1&#xff09;Html代碼&#xff08; 公共&#xff09;下載導入模板 js實現 &#xff08;方法1&#xff09;上傳文件實現 效果圖&#xff08;方法2&#xff09;代碼實現&#xf…

多語言大模型 Aya-23 開源!覆蓋23種語言,性能刷新SOTA

文章目錄 1. Aya-23 技術特點1.1 預訓練階段1.2 指令微調階段 2. Aya-23 性能表現3. Aya-23 多語言任務評估4. Aya-23 支持 23 種語言5. Aya-23 應用場景 近年來&#xff0c;多語言大模型&#xff08;MLLM&#xff09;發展迅速&#xff0c;但大多數模型的性能依然存在顯著差距&…

“滴滴打車,用友入賬”,YonSuite商旅費控助力企業“降低成本”更進一步

在當今競爭激烈的商業環境中&#xff0c;企業對于成本控制和效率提升的需求日益迫切。特別是在商旅管理方面&#xff0c;如何有效整合資源、優化流程、降低費用&#xff0c;成為了成長型企業關注的焦點。用友YonSuite商旅費控作為用友集團旗下的重要產品&#xff0c;憑借其卓越…

ctfshow pwn17-18

毛坯的人生和精裝的朋友圈 pwn17 while ( 1 ){menu();v4 0;puts("\nEnter the command you want choose:(1.2.3.4 or 5)\n");__isoc99_scanf("%d", &v4);switch ( v4 ){case 1:system("id");break;case 2:puts("Which directory?(/,…

克隆別人的項目并上傳到自己的倉庫

克隆別人的項目并上傳到自己的倉庫通常涉及以下步驟&#xff1a; 克隆項目&#xff1a;首先&#xff0c;你需要將別人的項目克隆到你的本地計算機。可以使用以下Git命令&#xff1a; git clone [項目的URL]將 [項目的URL] 替換為你想克隆的項目的URL。 創建新的倉庫&#xff1…

卡爾曼濾波算法的matlab實現

卡爾曼濾波算法的matlab實現 figure; hold on;Z(1:1:100); %觀測值&#xff1a;第一秒觀測1m 第二秒觀測兩米 勻速運動, 每秒1m, 最后擬合的也是速度 1m/splot(Z); plot([0,100], [1,1]);noiserandn(1,100)*0.5; %生成方差為1的高斯噪聲 ZZnoise; % 加入噪聲plot(Z);X[0;…

LabVIEW動態力傳感器校準系統

LabVIEW動態力傳感器校準系統 開發了一種基于LabVIEW的動態力傳感器校準系統。系統主要用于動態力的測量和校準&#xff0c;通過高度集成化和自動化的設計&#xff0c;顯著提升校準的效率和精確度。系統采用沖擊法進行動態校準&#xff0c;涵蓋了完整的硬件設計和軟件開發流程…

Kotlin 注解

文章目錄 定義注解類的注解標注目標聲明 定義 注解使用annotation關鍵字定義&#xff0c;且只能用于普通類&#xff0c;該類被稱為注釋類。可以使用注釋類為某個變量、函數、類、接口等注釋。與我們寫的代碼注釋類似&#xff0c;注釋類可以指明被標注類的狀態、作用等等&#…

智能體應用開發:構建各類垂直領域的ai智能體應用

最近在做個類似的項目&#xff0c;有用到這方面的知識&#xff0c;順便做一些記錄和筆記吧&#xff0c;希望能幫到大家了解智能體應用開發 目錄 引言 AI原生應用的興起 智能體在AI中的角色 實現原理詳解 機器學習基礎 數據管理與關聯數據庫 數據結構 Embedding 檢索方…

Pytorch實用教程:torch.cat()函數的用法詳解

torch.cat 是 PyTorch 中用于沿指定維度連接張量的函數。以下是該函數的詳細用法: 語法 torch.cat(tensors, dim=0, *, out=None)參數說明 tensors (sequence of Tensors): 要連接的張量序列。這些張量必須具有相同的形狀(除了連接的維度)。dim (int, optional): 沿著哪個…

衛星位置解算

前言&#xff1a; 本章節代碼均在Gitee中開源&#xff1a; 衛星位置計算代碼https://gitee.com/Ehundred/navigation-engineering/tree/master/%E5%8D%AB%E6%98%9F%E5%AF%BC%E8%88%AA%E5%8E%9F%E7%90%86/GPS%E5%8D%AB%E6%98%9F%E4%BD%8D%E7%BD%AE%E8%A7%A3%E7%AE%97/Satellit…

SAP物料自動記賬科目設置總結

SAP物料自動記賬科目設置總結 目錄 物料自動記賬科目設置總結... 1 總體說明... 1 庫存移動事務類型的設置... 4 庫存科目設置... 6 期初導入... 6 業務舉例... 6 配置... 6 庫存初始單據... 7 采購收貨(缺少到票) 8 業務舉例... 8 配置... 8 采購收貨單據-MIGO_GR…

心懷希望の光柵化

還記得什么是光柵化咩&#xff1f; 將三維空間的幾何形體顯現在屏幕上&#xff0c;這就是光柵化&#xff08;游戲、實時圖形學的應用&#xff09; Perspective Projection 在正交投影里如何定義三維空間中的立方體呢&#xff1f; 用x軸的覆蓋&#xff08;左、右&#xff09;…

【UML用戶指南】-02-UML基本元素的介紹(二)

目錄 1、語法和語義規則 2、UML中的公共機制 &#xff08;1&#xff09;規約 &#xff08;2&#xff09;修飾 &#xff08;3&#xff09;通用劃分 &#xff08;4&#xff09;擴展機制 衍型/版型/類型&#xff08;stereotype&#xff09; 標記值 &#xff08;tagged val…