Java異常分類處理拋出捕獲操作詳解
什么是異常
“程序運(yùn)行時(shí),發(fā)生的不被期望的事件,它阻止了程序按照程序員的預(yù)期正常執(zhí)行,這就是異常。”
我們在平時(shí)寫代碼的過程中就可能會遇到異常,給大家給舉一些容易遇到常見的異常例子:
1.算術(shù)異常

Exception in thread “main” java.lang.ArithmeticException: / by zero
在JAVA中,我們都知道0不能作為除數(shù),只能作為被除數(shù),如果把0作為除數(shù),編譯器就會提示我們出先算術(shù)異常了。
2.數(shù)組越界異常

Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 5
數(shù)組越界,我們應(yīng)該也不陌生,在使用數(shù)組時(shí),如果超過了數(shù)組的大小,就會形成越界。程序就會發(fā)生異常,從而終止運(yùn)行。
3.空指針異常

Exception in thread “main” java.lang.NullPointerException
對于數(shù)組arr,讓它賦值為null,我并沒有讓它指向任何對象,它就是一個(gè)空指針。對于空指針進(jìn)行訪問,編譯器就會提示我們空指針異常。
異常的分類
在代碼運(yùn)行時(shí),可能會出現(xiàn)異常種類有很多,為了對不同異?;蛘咤e(cuò)誤進(jìn)行很好的分類管理,Java內(nèi)部維護(hù)了一個(gè)異常的體系結(jié)構(gòu):

圖畫的不是很好,大家湊合著看吧。下面為大家講解一下這張圖:
1.Throwable類是Java語言中所有錯(cuò)誤(errors)和異常(exceptions)的父類。
2.Error:指的是Java虛擬機(jī)無法解決的嚴(yán)重問題,比如:JVM的內(nèi)部錯(cuò)誤、資源耗盡等。
3.Exception:異常產(chǎn)生后程序員可以通過代碼進(jìn)行處理,使程序繼續(xù)執(zhí)行。
異??赡茉诰幾g時(shí)發(fā)生,也可能在程序運(yùn)行時(shí)發(fā)生,根據(jù)發(fā)生的時(shí)機(jī)不同,可以將異常分為運(yùn)行時(shí)異常和編譯時(shí)異常。
編譯時(shí)異常
編譯時(shí)異常,也稱為受檢查異常。從名字我們就能夠理解,就是程序在編譯的時(shí)候發(fā)生的異常。
運(yùn)行時(shí)異常
在程序執(zhí)行期間發(fā)生的異常,稱為運(yùn)行時(shí)異常,也稱為非受檢查異常。
編譯時(shí)出現(xiàn)的語法性錯(cuò)誤,不能稱之為異常。編譯過程中就會出錯(cuò), 這是 “編譯期” 出錯(cuò)。而運(yùn)行時(shí)指的是程序已經(jīng)編譯通過得到class 文件了,再由 JVM 執(zhí)行過程中出現(xiàn)的錯(cuò)誤.
在Java中,異常處理主要的5個(gè)關(guān)鍵字:throw、try、catch、finally、throws
在講異常處理之前,我們先要了解一下異常處理中的關(guān)鍵字,接下來我會一一為大家介紹這些關(guān)鍵字。
異常的拋出(throw關(guān)鍵字)
在Java中,可以借助throw關(guān)鍵字,拋出一個(gè)指定的異常對象,將錯(cuò)誤信息告知給調(diào)用者
使用方法:throw new XXXException(“異常產(chǎn)生的原因”);
例如:
public static void main(String[] args) {
throw new RuntimeException();
}

雖然代碼沒錯(cuò),但是我是使用throw拋出的一個(gè)異常,所以程序就會反饋給我一個(gè)異常。
給大家總結(jié)一下throw在使用過程中要注意的一些地方:
- throw必須寫在方法體內(nèi)部
- 拋出的對象必須是Exception 或者 Exception 的子類對象
- 如果拋出的是 RunTimeException 或者 RunTimeException 的子類,則可以不用處理,直接交給JVM來處理
- 如果拋出的是編譯時(shí)異常,用戶必須處理,否則無法通過編譯
- 異常一旦拋出,其后的代碼就不會執(zhí)行
異常的捕獲
異常的捕獲,就是異常的具體處理方式,主要有兩種:異常聲明throws 和try-catch捕獲然后進(jìn)行處理。
throws關(guān)鍵字
throws一般位于方法聲明時(shí)參數(shù)列表之后。
使用方法:修飾符 返回值 方法名(形參)throws 異常類型(可以有多個(gè)異常類型)
聲明的異常必須是 Exception 或者 Exception 的子類
如果有多個(gè)異常,有用逗號隔開,如果拋出的異常具有父子類關(guān)系,可以直接throws父類
但是不建議直接用throws父類,范圍太大了。throws對異常并沒有真正處理,而是將異常報(bào)告給拋出異常方法的調(diào)用者,由調(diào)用者處理。如果要處理異常就要使用try-catch進(jìn)行處理。
try catch關(guān)鍵字
使用方式如下所示:
public static void main(String[] args) {
try{
//代碼
}catch (){//()里面寫你想捕捉的異常
//處理異常的代碼
}catch (){
//同上
}
}
1.try里面的代碼不一定會發(fā)生異常。
2.如果代碼發(fā)生了異常,且被catch捕獲到了,就會進(jìn)行對應(yīng)的處理,處理完成后就會跳出try-catch執(zhí)行后面的語句。
3.如果代碼發(fā)生了異常,但不是寫catch語句預(yù)期捕捉的異常的話,那么這個(gè)異常不會捕捉到,后面的代碼就不會被執(zhí)行。
4.try-catch可以捕捉多個(gè)異常,但不是同時(shí)捕獲。如果有多個(gè)異常,只能逐個(gè)捕獲。
5.如果有多個(gè)異常,并且有父子類關(guān)系,可以直接寫Exception,因?yàn)樗撬挟惓5母割?,但是也不建議這么寫,因?yàn)镋xception的范圍太廣了,因?yàn)槊總€(gè)異常處理的方法不一樣。
6.如果使用Exception,那么在寫catch的時(shí)候,要么只寫一個(gè)catch語句,里面放Exception,后面就不能繼續(xù)寫catch語句了,因?yàn)閷懥艘矝]什么用,而且出現(xiàn)的異常都會被Exception進(jìn)行捕獲。要么就把Exception放在最后寫,前面寫你想捕獲的異常,在最后再使用Exception。
7.try里面拋出異常位置之后的代碼將不會被執(zhí)行
finally關(guān)鍵字
finally的使用很簡單,使用方式如下:
public static void main(String[] args) {
try{
//代碼
}catch (RuntimeException e){
//()里面寫你想捕捉的異常
//處理異常的代碼
}catch (Exception e){
//同上
} finally{
//代碼
}
}
finally的作用:finally后面的代碼一定會執(zhí)行
前面講了try-catch用來捕獲并處理異常,但是有時(shí)發(fā)生的異常并沒有被捕捉到,那么程序也會發(fā)生異常終止,但用戶在使用的時(shí)候發(fā)生異常并終止程序,我們也需要對此進(jìn)行進(jìn)行一定的處理,就可以使用finally關(guān)鍵字,無論有沒有發(fā)生異常,finally內(nèi)的代碼也一定會執(zhí)行。
總結(jié)
異常處理的流程
- 程序先執(zhí)行 try 中的代碼
- 如果 try 中的代碼出現(xiàn)異常, 就會結(jié)束 try 中的代碼, 看和 catch 中的異常類型是否匹配.
- 如果找到匹配的異常類型, 就會執(zhí)行 catch 中的代碼
- 如果沒有找到匹配的異常類型, 異常得不到處理,就會交給JVM處理,程序就會異常終止.
- 無論是否找到匹配的異常類型, finally 中的代碼都會被執(zhí)行到(在該方法結(jié)束之前執(zhí)行).
除此之外,大家也要熟練掌握異常的種類和throw、try、catch、finally、throws這幾個(gè)關(guān)鍵字的用法。
到此這篇關(guān)于Java異常分類處理拋出捕獲操作詳解的文章就介紹到這了,更多相關(guān)Java異常內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
fastJson泛型如何轉(zhuǎn)換的實(shí)現(xiàn)
這篇文章主要介紹了fastJson泛型如何轉(zhuǎn)換的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
SpringBoot項(xiàng)目中出現(xiàn)不同端口跨域問題的解決方法
這篇文章主要介紹了SpringBoot項(xiàng)目中出現(xiàn)不同端口跨域問題的解決方法,文中介紹了兩種解決方法,并給出了詳細(xì)的代碼供大家參考,具有一定的參考價(jià)值,需要的朋友可以參考下2024-03-03
springboot 使用yml配置文件給靜態(tài)變量賦值教程
這篇文章主要介紹了springboot 使用yml配置文件給靜態(tài)變量賦值教程,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04
Mybatis學(xué)習(xí)總結(jié)之mybatis使用建議
這篇文章主要介紹了Mybatis學(xué)習(xí)總結(jié)之mybatis使用建議的相關(guān)資料,非常具有參考借鑒價(jià)值,需要的朋友可以參考下2016-05-05
如何使用Java統(tǒng)計(jì)gitlab代碼行數(shù)
這篇文章主要介紹了如何使用Java統(tǒng)計(jì)gitlab代碼行數(shù),實(shí)現(xiàn)方式通過git腳本將所有的項(xiàng)目拉下來并然后通過進(jìn)行代碼行數(shù)的統(tǒng)計(jì),需要的朋友可以參考下2023-10-10
Java中Map與JSON數(shù)據(jù)之間的互相轉(zhuǎn)化
我們在開發(fā)中難免和JSON打交道,這不小編最近遇到了,需要把一些信息轉(zhuǎn)成JSON字符串,下面這篇文章主要給大家介紹了關(guān)于Java中Map與JSON數(shù)據(jù)之間的互相轉(zhuǎn)化,需要的朋友可以參考下2023-04-04

