Java——異常

1.什么是異常

將程序執行過程中發生的不正常行為稱為異常

常見的異常有:算數異常,空指針異常,數組越界異常

每一種異常都有對應的類對齊描述

為了對每一種異常進行管理,Java內部實現了一個對異常的體系結構

1. Throwable:是異常體系的頂層類,其派生出兩個重要的子類, Error 和 Exception

2. Error:指的是Java虛擬機無法解決的嚴重問題,比如:JVM的內部錯誤、資源耗盡等,典型代表: StackOver?owError和OutOfMemoryError,一旦發生回力乏術。

3. Exception:異常產生后程序員可以通過代碼進行處理,使程序繼續執行。比如:感冒、發燒。我們平時所說 的異常就是Exception。


異常的分類:

1.異常分為兩類,編譯時異常(受查異常),運行時異常(非受查異常)

2.編譯時異常,即在編寫代碼時就被檢查出來的異常,如在使用clone方法時出現的異常

3.運行時異常,即在編譯時未被檢查出來的異常,在運行的時候被檢查出來的異常,如空指針異常,數組越界異常。(RuntimeExcption以及其子類都被稱為運行時異常)

2.異常的處理

2.1防御式編程

事前防御型:在運行代碼前,對其進行檢查

boolean ret = false;
ret = 登陸游戲();
if (!ret) {處理登陸游戲錯誤;return;
}
ret = 開始匹配();
if (!ret) {處理匹配錯誤;return;
}
ret = 游戲確認();
if (!ret) {處理游戲確認錯誤;return;
}
ret = 選擇英雄();
if (!ret) {處理選擇英雄錯誤;return;
}

這種方式的代碼,缺點很明顯缺陷:就是正常流程和錯誤處理流程代碼混在一起, 代碼整體顯的比較混亂。

事后認錯型:就是先操作,遇到問題再處理

try {登陸游戲();開始匹配();游戲確認();選擇英雄();載入游戲畫面();...
} catch (登陸游戲異常) {處理登陸游戲異常;
} catch (開始匹配異常) {處理開始匹配異常;
} catch (游戲確認異常) {處理游戲確認異常;
} catch (選擇英雄異常) {處理選擇英雄異常;
} catch (載入游戲畫面異常) {處理載入游戲畫面異常;
}

這種方式的異常處理,將正常流程和錯誤處理流程代碼分開,使代碼清晰明了,方便程序員理解

在Java中,異常處理主要的5個關鍵字:throw、try、catch、?nal、throws。

2.2異常的拋出

在Java中,我們在編寫程序時,如果程序出現錯誤就需要將錯誤的信息告知調用者

拋出異常的格式:

throw new XXXXXException(“異常產生的原因”);
//XXXXXException為此異常對應的類

數組越界異常的拋出

要求:實現一個方法,獲取數組任意下標的元素

public class T1 {public static void main(String[] args) {
int []arr={0,1,2,3,4,5,6,7,8,9};System.out.println(getElement(arr,5));System.out.println(getElement(arr,-1));}public static int getElement(int[] array, int index) {if(array==null){throw new NullPointerException("數組為空");}if (index<0||index>=array.length){throw new ArrayIndexOutOfBoundsException("數組越界異常");}return array[index];}}

1. throw必須寫在方法體內部

2. 拋出的對象必須是Exception 或者 Exception 的子類對象

3. 如果拋出的是 RunTimeException 或者 RunTimeException 的子類,則可以不用處理,直接交給JVM來處理

4. 如果拋出的是編譯時異常,用戶必須處理,否則無法通過編譯

5. 異常一旦拋出,其后的代碼就不會執行

2.3異常的捕獲

異常的捕獲,也就是異常的具體處理方式,主要有兩種:異常聲明throws 以及 try-catch捕獲處理。

異常聲明throws:

處在方法聲明時參數列表之后,當方法中拋出編譯時異常,用戶不想處理該異常,此時就可以借助throws將異常拋 給方法的調用者來處理。即當前方法不處理異常,提醒方法的調用者處理異常。

語法格式:
修飾符 ?返回值類型 ? 方法名(參數列表) throws 異常類型1,異常類型2...{}

注意

1. throws必須跟在方法的參數列表之后

2. 聲明的異常必須是 Exception 或者 Exception 的子類

3. 方法內部如果拋出了多個異常,throws之后必須跟多個異常類型,之間用逗號隔開,如果拋出多個異常類型 具有父子關系,直接聲明父類即可。

4. 調用聲明拋出異常的方法時,調用者必須對該異常進行處理,或者繼續使用throws拋出

try-catch捕獲并處理:

throws對異常并沒有真正處理,而是將異常報告給拋出異常方法的調用者,由調用者處理。如果真正要對異常進行 處理,就需要try-catch。

語法格式:
try{// 將可能出現異常的代碼放在這里
}catch(要捕獲的異常類型 ?e){// 如果try中的代碼拋出異常了,此處catch捕獲時異常類型與try中拋出的異常類型一致時,或者是try中拋出異常的基類
時,就會被捕獲到// 對異常就可以正常處理,處理完成后,跳出try-catch結構,繼續執行后序代碼
}catch(異常類型 e){// 對異常進行處理
}?nally{// 此處代碼一定會被執行到
}

當異常被捕獲到時,異常就被處理了,這里的后序代碼一定會執行

如果捕獲了,由于捕獲時類型不對,那就沒有捕獲到,這里的代碼就不會被執行


注意:

1. try中的代碼可能會拋出異常,也可能不會

2.catch和finally按照需求添加,在這個try-catch()中,有多個catch()中的異常類型時,都是子類異常類在前catch(),父類異常類在后catch()。

小結:

1. try塊內拋出異常位置之后的代碼將不會被執行

2. 如果拋出異常類型與catch時異常類型不匹配,即異常不會被成功捕獲,也就不會被處理,繼續往外拋,直到 JVM收到后中斷程序----異常是按照類型來捕獲的

3. try中可能會拋出多個不同的異常對象,則必須用多個catch來捕獲----即多種異常,多次捕獲

如果多個異常的處理方式是完全相同, 也可以寫成這樣:

catch (ArrayIndexOutOfBoundsException | NullPointerException e) {...
}

如果異常之間具有父子關系,一定是子類異常在前catch,父類異常在后catch,否則語法錯誤

4. 可以通過一個catch捕獲所有的異常,即多個異常,一次捕獲(不推薦),由于 Exception 類是所有異常類的父類. 因此可以用這個類型表示捕捉所有異常.

5.catch 進行類型匹配的時候, 不光會匹配相同類型的異常對象, 也會捕捉目標異常類型的子類對象. 如剛才的代碼, NullPointerException 和 ArrayIndexOutOfBoundsException 都是 Exception 的子類, 因此都能被捕獲到.

2.4finally

1.無論try-catch是否捕獲到異常,finally里面的語句都會被執行

2.?nally中的代碼一定會執行的,一般在?nally中進行一些資源清理的掃尾工作

3.?nally 執行的時機是在方法返回之前(try 或者 catch 中如果有 return 會在這個 return 之前執行 ?nally). 但是如果 ?nally 中也存在 return 語句, 那么就會執行 ?nally 中的 return, 從而不會執行到 try 中原有的 return. 一般我們不建議在 ?nally 中寫 return (被編譯器當做一個警告).

?

3.異常的處理流程

1.程序先執行 try 中的代碼 如果 try 中的代碼出現異常, 就會結束 try 中的代碼, 看和 catch 中的異常類型是否匹配.

2.如果找到匹配的異常類型, 就會執行 catch 中的代碼 如果沒有找到匹配的異常類型, 就會將異常向上傳遞到上層調用者.

3.無論是否找到匹配的異常類型, ?nally 中的代碼都會被執行到(在該方法結束之前執行).

4.如果上層調用者也沒有處理異常, 就繼續向上傳遞.

5.一直到 main 方法也沒有合適的代碼處理異常, 就會交給 JVM 來進行處理, 此時程序就會異常終止.

4.自定義異常

Java中雖然定義了許多異常,但是在各種業務中,為了滿足業務的需求需要,我們需要自定義異常來滿足業務需求

登錄系統:

我們在處理用戶名密碼錯誤的時候可能就需要拋出兩種異常. 我們可以基于已有的異常類進行擴展(繼承), 創建和我們業務相關的異常類.

class nameExpection extends Exception{public nameExpection(String message) {super(message);}
}
class passwordExpection extends Exception{public passwordExpection(String message) {super(message);}
}public class T2 {private static String name="張三";private static String password="12345";public static void login(String name1, String password1) throws nameExpection,passwordExpection{if (!name.equals(name1)){
throw new nameExpection("用戶名錯誤");}if (password.equals(password1)){throw new passwordExpection("登錄密碼錯誤");}System.out.println("登錄成功");}public static void main(String[] args) {try {login("李四","22341");} catch (nameExpection e) {e.printStackTrace();} catch (passwordExpection e) {e.printStackTrace();}}
}

具體方式:

1. 自定義異常類,然后繼承自Exception 或者 RunTimeException

2. 實現一個帶有String類型參數的構造方法,參數含義:出現異常的原因

注意事項:

1.自定義異常通常會繼承Exception 或者 RuntimeException

2.繼承Exception的異常默認是受查異常 繼承自RuntimeException 的異常默認是非受查異常.

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

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

相關文章

CS2游戲30萬掛箱賬號被封,飾品市場要變天

Steam游戲平臺上CS2的玩家在線人數常年位于第一位&#xff0c;即便偶爾會被爆款游戲擠下來&#xff0c;但一切都是暫時的。飾品交易作為CS2的重要組成部分&#xff0c;早已成為了維系游戲熱度的不二法門。可相對應的&#xff0c;各種掛箱子的工作室及個人也孕育而生。 但近來V社…

mysql多啟動

binary安裝&#xff1a; 1、redhat rpm 2、mysql rpm 3、mysql glibc source安裝&#xff1a; 1、5.1mysql(./configure && make && make install) 2、5.5mysql(cmake && make && make install) 單啟動&#xff1a; 1、安裝 tar xf xxx.tar…

【Docker學習】docker pull詳細說明

docker pull是我們經常用到的一個命令。我們使用一些官方鏡像&#xff0c;如MySql、Nginx等都需要用docker pull下載。不過不用的話&#xff0c;也可以。比如使用docker run&#xff0c;要是找不到鏡像&#xff0c;會自動下載。 命令&#xff1a; docker image pull 描述&am…

Uniapp寫一個簡單的商品瀑布流界面+商品詳情

最終效果&#xff1a; 整體內容比較簡單&#xff0c;參考了一篇瀑布流文章和一篇商品詳情文章隨便修改整了下&#xff0c;主要是給想做這方便面的新人一個簡單邏輯的展示&#xff08;其實我也是第一次寫這個emmm&#xff09; 一.組件下載&#xff1a; uni-icon uni-goods-nav…

什么是ACP?

前言 ACP指的是應用程序控制平面&#xff0c;是微服務架構中的一個關鍵組成部分。它負責管理微服務架構中的各個微服務&#xff0c;包括服務發現和注冊、負載均衡、服務路由、熔斷和降級、配置管理等方面的功能。 A&#xff1a;可用性 所有請求都有響應。C&#xff1a;強一致…

[DDR5 Jedec 3-4] 模式寄存器 Mode Register MRR/MRW

依公知及經驗整理,原創保護,禁止轉載。 專欄 《深入理解DDR》 1. 概念 模式寄存器用于定義各種操作模式。在初始化過程中,可以通過重新執行MRS命令來更改模式寄存器的內容。即使用戶只想修改模式寄存器變量的一個子集,在發出MRS命令時也必須編程所有變量。 只有當所有ban…

C語言案例-輸入任意三個數,按從大到小的順序輸出.

目錄 問題待續、更新中 問題 輸入任意三個數,按從大到小的順序輸出. 最大值 3數&#xff0c;重新排序輸出 輸出數據if來&#xff0c;ab ac bc比&#xff0c;比中里面交換值&#xff0c;輸出abc時為降序 代碼如下: #include <stdio.h> void main() {int a,b,c,t;printf(&…

現實殘酷!存款百萬只是少數人的游戲,普通家庭能存多少?

近期&#xff0c;網絡上掀起了一股關于普通家庭終身存款上限的熱烈討論。一位網友通過簡單的算術方式提出了一個假設&#xff1a;如果一對夫妻每年收入15萬&#xff0c;并成功將6萬存入銀行&#xff0c;那么從25歲步入社會至60歲退休&#xff0c;他們理論上能積累到210萬的存款…

從0開發一個Chrome插件:Manifest 文件詳解

前言 這是《從0開發一個Chrome插件》系列的第六篇文章,本系列教你如何從0去開發一個Chrome插件,每篇文章都會好好打磨,寫清楚我在開發過程遇到的問題,還有開發經驗和技巧。 專欄: 從0開發一個Chrome插件:什么是Chrome插件?從0開發一個Chrome插件:開發Chrome插件的必要…

C++知識點總結(36):二分進階練習

二分答案練習 一、憤怒的羊駝題目描述輸入描述輸出描述樣例1提示參考答案 二、偷吃西瓜題目描述輸入描述輸出描述樣例1提示參考答案 三、丟沙包題目描述輸入描述輸出描述樣例1提示參考答案 四、木材加工題目描述輸入描述輸出描述樣例1提示參考答案 五、路標設置題目描述輸入描述…

Go語言之GORM框架(四)——預加載,關聯標簽與多態關聯,自定義數據類型與事務(完結篇)

前言 本來是想著寫多表關系的&#xff0c;不過寫了一半發現重復的部分太多了&#xff0c;想了想與其做一些重復性工作&#xff0c;不如把一些當時覺得抽象的東西記錄一下&#xff0c;就當用一篇雜記完成專欄的最后一篇文章吧。 預加載 簡單示例 預加載主要用于在多表關系中…

谷歌瀏覽器的平替,內置開掛神器,我已愛不釋手!

油猴瀏覽器正式版是一款基于谷歌Chromium源碼開發的瀏覽器&#xff0c;它集成了集成了強大的油猴擴展&#xff08;Tampermonkey&#xff09;&#xff0c;使得用戶可以輕松安裝各種腳本&#xff0c;從而增強網頁瀏覽體驗。提供了一個更加個性化和高效的瀏覽體驗。 油猴擴展&…

git使用流程

1.下載git 搜索下載 2.注冊github賬號&#xff08;打開爬墻工具&#xff09; 創建一個倉庫 3.配置郵箱和密碼 4.所以找一個文件夾 鼠標右鍵 選擇 open Git Bash here&#xff08;當前文件夾下打開命令行&#xff09; 輸入命令 配置用戶名和郵箱 5.將建的倉庫克隆下來 …

【JS實戰案例匯總——不定時更新版】

一&#xff1a;轉換時間案例 1 需求&#xff1a; 用戶輸入秒數&#xff0c;系統會自動將秒數轉變為小時、分鐘、秒&#xff0c;并且不滿10的要在前面補零 2 算法&#xff1a; 小時:hour parseInt(總秒數/60/60%24) 分鐘:minute parseInt(總秒數/60%60) 秒數:second pa…

測試基礎09:缺陷(bug)生命周期、定位方式和管理規范

課程大綱 1、缺陷&#xff08;bug&#xff09;生命周期 2、缺陷&#xff08;bug&#xff09;提交規范 2.1 宗旨 簡潔、清晰、可視化&#xff0c;減少溝通成本。 2.2 bug格式和內容 ① 標題&#xff1a;一級功能-二級功能-三級功能_&#xff08;一句話描述bug&#xff1a;&…

---初始Linux---

一、認識計算機 計算機 硬件 軟件 硬件&#xff1a;就是計算機系統中由電子、機械和光電元件等組成的各種物理裝置的總稱&#xff08;CPU\GPU\...&#xff09; 軟件&#xff1a;是用戶和計算機硬件之間及進行交流的工具 然而一個簡單的計算機或者說基本的計算機就是有兩大…

浙江大學數據結構MOOC-課后習題-第十講-排序5 PAT Judge【未完成】

題目匯總 浙江大學數據結構MOOC-課后習題-拼題A-代碼分享-2024 題目描述 這段文字是關于如何生成PAT&#xff08;一種編程能力測試&#xff09;的排行榜的說明。下面是這段文字的中文翻譯&#xff1a; 輸入說明&#xff1a; 每個輸入文件包含一個測試案例。對于每個案例&…

C++ A (1020) : 冪運算

文章目錄 一、題目描述二、參考代碼 一、題目描述 二、參考代碼 #include<bits/stdc.h> using namespace std; typedef long long ll;void qq(ll a, ll b, ll m) {if (a 0) cout << 0 << endl;;ll out 1;a % m;while (b > 0){if (b & 1)//奇數的最…

[AIGC] Vue2與Vue3的主要區別和示例代碼

Vue3是Vue框架的最新版本&#xff0c;它在性能、開發體驗和代碼體積等方面都有很大的改進。接下來我們將通過比較Vue2和Vue3的主要區別&#xff0c;進一步理解這些改變是如何影響我們的。 文章目錄 一、性能提升二、Composition API三、更好的類型支持四、生命周期鉤子函數變化…

lux和ffmpeg進行下載各大主流自媒體平臺視頻

1、lux下載&#xff0c;鏈接&#xff1a;https://pan.baidu.com/s/1WjGbouL3KFTU6LeqZmACpA?pwdagpp 提取碼&#xff1a;agpp 2、ffmpeg下載&#xff0c;跟lux放在同一個目錄&#xff1b; 3、為lux、ffmpeg設置環境變量&#xff1b; 4、WINR&#xff0c;打開運行&#xff0…