Java?異常機(jī)制Exception和自定義異常
異常機(jī)制
異常:就是不符合實(shí)際需求,在實(shí)際中可能不存在也可能不滿(mǎn)足實(shí)際,所以出現(xiàn)的問(wèn)題稱(chēng)之為異常。
異常的三種類(lèi)型:
- 檢查性異常:用戶(hù)錯(cuò)誤或問(wèn)題引起的異常,是程序員無(wú)法預(yù)見(jiàn)的。例如打開(kāi)一個(gè)不存在的文件,就會(huì)發(fā)生一個(gè)檢查性異常。
- 運(yùn)行時(shí)異常:是可能被程序員避免的異常,與檢查性異常相反,運(yùn)行時(shí)異常可以在編譯是被忽略。
- 錯(cuò)誤(ERROR):錯(cuò)誤不是異常!錯(cuò)誤是脫離了程序員的問(wèn)題。一般不是程序員的問(wèn)題。
異常體系結(jié)構(gòu)
Java當(dāng)中,萬(wàn)物皆對(duì)象,Java將異常當(dāng)作對(duì)象來(lái)處理,定義了一個(gè)基類(lèi)(父類(lèi)),java.lang.Throwable作為異常的超類(lèi)。 java中的異常分為兩大類(lèi):錯(cuò)誤(Error)和異常(Exception)。 錯(cuò)誤: Error是由Java虛擬機(jī)產(chǎn)生并拋出的,大多數(shù)的錯(cuò)誤與程序員是沒(méi)有關(guān)系的。 多數(shù)情況是Java虛擬機(jī)運(yùn)行錯(cuò)誤(Virtual MachineError),Java虛擬機(jī)將會(huì)終止線(xiàn)程。 這些錯(cuò)誤是不可查的,因?yàn)樵诔绦虻目刂颇芰χ狻?nbsp;異常: 在異常(Exception)分支中有一個(gè)重要的子類(lèi)RuntimeException(運(yùn)行時(shí)異常);
- ArrayIndexOutofBoundsException(數(shù)組下標(biāo)越界異常)
- ClassNotFoundException(找不到類(lèi)異常)
等異常是不檢查異常,程序可以選擇捕獲處理,也可以不處理。 這些異常通常是因?yàn)槌绦蜻壿嬪e(cuò)誤引起的,程序應(yīng)該從邏輯角度盡可能的避免異常的發(fā)生。 錯(cuò)誤(Error)與異常(Exception)的區(qū)別: Error通常是災(zāi)難性致命的錯(cuò)誤,是程序無(wú)法控制和處理的,當(dāng)出現(xiàn)這些異常時(shí),Java虛擬機(jī)(JVM)會(huì)選擇終止線(xiàn)程;Exception通常情況時(shí)可以被程序處理的,并且在程序中,盡可能的去處理和發(fā)現(xiàn)這些異常,這些異常通常是程序員的邏輯出現(xiàn)的問(wèn)題。異常當(dāng)中,RuntimeException(運(yùn)行時(shí)異常),除此之外的異常統(tǒng)稱(chēng)為非運(yùn)行時(shí)異常。注意的是錯(cuò)誤就是錯(cuò)誤,異常可以分為運(yùn)行時(shí)異常和非運(yùn)行時(shí)異常。
異常的捕獲與拋出
- 拋出異常
- 捕獲異常
異常處理的5個(gè)關(guān)鍵字:
- try(嘗試著去處理,試一試的意思)、catch(捕獲)、finally(是否執(zhí)行都會(huì)走到這個(gè)語(yǔ)句當(dāng)中)、throw(拋出異常)、throws(拋出異常)。
捕獲并拋出異常: 舉例:數(shù)組下標(biāo)越界異常處理:

正如上圖所示,并別有輸出數(shù)組下標(biāo)的元素,因?yàn)樵乇旧砭筒淮嬖?,產(chǎn)生異常,所以將異常進(jìn)行捕獲并進(jìn)行了拋出。 值得注意的是在普通異常當(dāng)中,可以不使用finally,但是try與catch是必須要的,必不可少的,finally在IO流當(dāng)中可以明顯的發(fā)現(xiàn)它的作用。比如說(shuō)在Scanner當(dāng)中,需要關(guān)閉用戶(hù)輸入(scanner.close()),那么finally就起到了很重要的作用。 值得注意的是異常的基類(lèi),Throwable是所有異常的父類(lèi),
如下圖所示:

catch (Error e)中,括號(hào)里面的Error為想要捕獲的異常類(lèi)型,e為一個(gè)變量。 在Java當(dāng)中可以捕獲多個(gè)異常,Java中進(jìn)行了提供,如下圖所示(當(dāng)程序中可能出現(xiàn)多個(gè)異常時(shí)): 下圖中我們可以得到結(jié)果,該程序是一個(gè)異常,而不是一個(gè)錯(cuò)誤!

下面的代碼就好像一個(gè)循環(huán),如果程序中可能將會(huì)出現(xiàn)多個(gè)異常,那么就可以在下面的語(yǔ)句中實(shí)現(xiàn),切記的是異?;?lèi)可以放在最后。
try{
}catch(){
System.out.println();
}catch(){
System.out.println();
}finally{
}下圖中是捕獲多個(gè)異常,但是將異常的基類(lèi)放在了第一個(gè),導(dǎo)致程序報(bào)錯(cuò),所以后面的捕獲失去了意義導(dǎo)致報(bào)錯(cuò)。所以異常的基類(lèi)應(yīng)該放在最后!

注意:我們可以看到上圖中出現(xiàn)報(bào)錯(cuò),是因?yàn)楫惓5牟东@需要從小到大,但是第一個(gè)直接就放了一個(gè)最大的基類(lèi),所以出現(xiàn)報(bào)錯(cuò)。如果說(shuō)需要捕獲多個(gè)異常,那么需要從小到大類(lèi)捕獲。 try-catch快捷鍵的使用:選中需要try的部分:ctrl+alt+T,
如下圖所示:


假如說(shuō)程序出現(xiàn)異常,我們可以讓程序運(yùn)行結(jié)束或者說(shuō)是退出:

上面的括號(hào)中的數(shù)字,任意即可,表示程序異常時(shí)退出程序! 在異常當(dāng)中,我們可以主動(dòng)的去判斷是否有異常,然后再進(jìn)行拋出異常。
如下圖(主動(dòng)拋出異常):

異常的主動(dòng)拋出一般在方法當(dāng)中使用!如下圖所示:

如果我們知道會(huì)有異常,上面的方法又處理不掉異常,那么可以在方法上拋出異常。
如下圖所示: 注意:在方法中拋出異常使用throw,但是在方法上使用throws!

在方法體中沒(méi)有解決掉異常的拋出,在方法上拋出異常,拋出異常后如果不使用try-catch,那么程序就不會(huì)繼續(xù)執(zhí)行。使用try-catch后,程序仍然會(huì)繼續(xù)執(zhí)行。
使用try-catch時(shí):

不使用try-catch時(shí):

自定義異常
使用Java內(nèi)置的異常類(lèi)可以描述在編程時(shí)出現(xiàn)的大部分異常,但是,用戶(hù)還可以自定義異常。用戶(hù)自定義異常類(lèi),只需要繼承Exception。
自定義異常步驟如下:
- 創(chuàng)建自定義的異常類(lèi);
- 在方法當(dāng)中通過(guò)throw關(guān)鍵字拋出異常對(duì)象;
- 如果在當(dāng)前拋出異常的方法當(dāng)中處理異常,可以使用try-catch語(yǔ)句捕獲并進(jìn)行處理;否則在方法的聲明語(yǔ)句當(dāng)中通過(guò)throws關(guān)鍵字指明拋出給方法調(diào)用者的異常,繼續(xù)執(zhí)行下一步操作;
- 在出現(xiàn)異常方法的調(diào)用者中捕獲并處理異常。
自定義異常類(lèi)的書(shū)寫(xiě),在書(shū)寫(xiě)的過(guò)程當(dāng)中,或許我們只知道需要繼承Exception,但是當(dāng)繼承之后無(wú)法入手,我們可以通過(guò)看一下異常處理的一些方法,如下圖所示: 第一步:

第二步:傳入一個(gè)符合程序,不會(huì)拋出異常的值;

第三步:打印一個(gè)不符合程序設(shè)定的值,拋出異常;

總圖: 1.拋出異常的圖:

2.沒(méi)有拋出異常的圖:

總結(jié):
- 運(yùn)行時(shí)處理異常,采用邏輯合理規(guī)避,使用try-catch處理;
- 盡可能的使用finally語(yǔ)句塊去釋放占用的資源;
- 異常需要盡可能的去處理,不要簡(jiǎn)單的打印輸出;
- 對(duì)于潛在的異常,可以使用try-catch處理潛在的異常,還有不確定的代碼可以使用try-catch進(jìn)行規(guī)避;
- 具體的如何去處理異常,根據(jù)不同的業(yè)務(wù)需求和異常情況去進(jìn)行合理的異常。
到此這篇關(guān)于Java 異常機(jī)制Exception+自定義異常的文章就介紹到這了,更多相關(guān)Java Exception內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java 數(shù)組內(nèi)置函數(shù)toArray詳解
這篇文章主要介紹了Java 數(shù)組內(nèi)置函數(shù)toArray詳解,文本詳細(xì)的講解了toArray底層的代碼和文檔,需要的朋友可以參考下2021-06-06
SpringBoot中的@Conditional?注解的使用
@Conditional是Spring4新提供的注解,它的作用是按照一定的條件進(jìn)行判斷,滿(mǎn)足條件的才給容器注冊(cè)Bean,本文主要介紹了SpringBoot中的@Conditional?注解的使用2024-01-01
一文帶你學(xué)習(xí)Java多維數(shù)組的使用技巧
Java作為一門(mén)廣泛應(yīng)用于各行各業(yè)的開(kāi)發(fā)語(yǔ)言,具有豐富的數(shù)據(jù)類(lèi)型支持,其中多維數(shù)組是其重要的一種,多維數(shù)組可以更加方便地組織數(shù)據(jù),提高Java應(yīng)用程序的效率,本文將為大家介紹Java中多維數(shù)組的基本概念和常用操作,助力讀者更好地掌握多維數(shù)組的使用技巧2023-11-11
SpringBoot使用Apache POI庫(kù)讀取Excel文件的操作詳解
在日常開(kāi)發(fā)中,我們經(jīng)常需要處理Excel文件中的數(shù)據(jù),無(wú)論是從數(shù)據(jù)庫(kù)導(dǎo)入數(shù)據(jù)、處理數(shù)據(jù)報(bào)表,還是批量生成數(shù)據(jù),都可能會(huì)遇到需要讀取和操作Excel文件的場(chǎng)景,本文將詳細(xì)介紹如何使用Java中的Apache POI庫(kù)來(lái)讀取Excel文件,需要的朋友可以參考下2025-01-01
Java Management Extensions管理擴(kuò)展原理解析
這篇文章主要介紹了Java Management Extensions管理擴(kuò)展原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
springboot操作阿里云OSS實(shí)現(xiàn)文件上傳,下載,刪除功能
這篇文章主要介紹了springboot操作阿里云OSS實(shí)現(xiàn)文件上傳,下載,刪除功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11

