這篇文章,我們來講一下java的異常體系
目錄
1.異常概述
2 java的異常繼承體系
2.1 編譯時異常
2.2 運行時異常
2.3 底層原理
2.4 異常的作用
3.異常的處理方式
3.1 JVM默認的處理方式
3.2 自己處理(捕獲異常)
3.2.1自己處理的4個問題
3.2.2 異常中的常見方法
3.3 拋出處理
3.3.1 throws
3.3.2 throw
4.小結(jié)
1.異常概述
首先,我們來認識一下異常
異常:異常就是代表程序出現(xiàn)的問題
注意:我們學(xué)習異常不是讓我們以后寫代碼不出現(xiàn)異常,而是程序出了異常之后,我們應(yīng)該如何處理
下面舉個例子,來看一下異常:
?java中有許多異常,上面舉的只是兩個簡單的例子而已
2 java的異常繼承體系
java中有許許多多的異常,這些異常組成了java的異常體系,下面來看一下:
下面來詳細的說一下各個部分
- Error:代表的系統(tǒng)級別錯誤(屬于嚴重問題)系統(tǒng)一旦出現(xiàn)問題,sun公司會把這些錯誤封裝成Error對象。Error是給sun公司自己用的,不是給我們程序員用的。因此,我們開發(fā)人員不用管它
- Exception:叫做異常,代表程序可能出現(xiàn)的問題。我們通常會用Exception以及它的子類來封裝程序出現(xiàn)的問題
- 運行時異常:RuntimeException及其子類,編譯階段不會出現(xiàn)異常提醒。運行時出現(xiàn)的異常(如:數(shù)組索引越界異常)
- 編譯時異常:編譯階段就會出現(xiàn)異常提醒(如日期解析異常)
?注意:異常體系的最上層父類是Exception,而不是java.lang.Throwable
2.1 編譯時異常
編譯時異常,就是我們在寫代碼時,不運行就會出現(xiàn)的錯誤,idea中會用紅色波浪線標記出來,如果我們不出來,則代碼運行不了。
下面,我們通過具體的實例來看一下:
如上圖所示,這就是編譯時異常,我們可以進行相應(yīng)的異常處理:
然后就可以正常運行了:
?編譯時異常是很好解決,我們可以直接在主方法上拋出異常就行
2.2 運行時異常
運行時異常就是RuntimeException及其子類,在編譯階段不會是出現(xiàn)異常提醒的。它運行時出現(xiàn)的異常(如:數(shù)組索引越界異常)
?下面還是通過具體實例來看一下:
然后,我們運行看一下:
就會出現(xiàn)紅色錯誤,然后指出錯誤類型,指出具體位置
這就是運行時異常。
2.3 底層原理
?下面,我們來看一下為什么會出現(xiàn)編譯異常和運行時異常兩種異常
而我們的編譯器在編譯階段,java是不會運行代碼的,它只會檢查語法是否有錯誤,或者做一些優(yōu)化,所以就會出現(xiàn)這兩種異常
2.4 異常的作用
下面,講一下異常的作用
作用一:異常是用來查詢bug的關(guān)鍵參考信息
作用二:異??梢宰鳛榉椒▋?nèi)部的一種特殊返回值,以便通知調(diào)用者底層的執(zhí)行情況
這里就不舉具體例子了
3.異常的處理方式
上面講了異常的概念,異常體系,下面我們來講一下異常的處理方式
異常的處理方式有三種,分別是:JVM默認的處理方式,自己處理,拋出異常
3.1 JVM默認的處理方式
當我們的代碼中有異常的時候,如果我們沒有自己處理,沒有拋出異常,那么就會采用JVM的默認處理方式來處理
JVM的默認處理方式是這樣的:
- 把異常的名稱,異常原因以及異常出現(xiàn)的位置等信息輸出在了控制臺
- 程序停止運行,下面的代碼就不會運行
下面看一下具體實例:
3.2 自己處理(捕獲異常)
下面我們來看一下異常處理的第二種方式:自己處理
它的格式如下:
try{
可能出現(xiàn)異常的代碼;
}catch(異常類 異常名){
異常的處理代碼;
}
?這樣的目的:當代碼出現(xiàn)異常時,可以讓程序繼續(xù)往下運行
下面通過具體實例來看一下:
再看一下結(jié)果:
?
下面,我們就上面的這個代碼,來分析一下它的具體執(zhí)行過程:
首先,程序進入到 try 里面,執(zhí)行try里面的代碼,如果出現(xiàn)了異常,它就會創(chuàng)建出相應(yīng)的異常類對象,比如我們這里出的是索引越界異常,也就是ArrayIndexOutOfBoundsException異常,所以它就會創(chuàng)建一個ArrayIndexOutOfBoundsException異常對象,然后拿著這個對象到catch的小括號中進行比較,看括號中的變量能否接收這個對象(Exception是所有異常的父類),如果可以接收,那么就執(zhí)行catch里面的代碼,如果不可以接收,就會在編譯時報錯。這就是它的執(zhí)行流程。
3.2.1自己處理的4個問題
下面,關(guān)于自己處理異常這種方式,或者說try?{ } catch( ) { } 這個方式,提幾個問題。
問題一:如果try中沒有遇到問題,怎么執(zhí)行?
答:執(zhí)行try中的代碼,catch中的代碼不執(zhí)行
注意:只有出現(xiàn)異常,才會執(zhí)行catch中的代碼
看實例:
?
問題二:如果try中可能會遇到多個問題,怎么執(zhí)行?
答:但凡try中出現(xiàn)異常,并且異常被捕獲,那么就會執(zhí)行catch,然后繼續(xù)執(zhí)行下面的代碼,不會管其他的異常
注意:try中但凡出現(xiàn)一個異常,就會跳過try的部分
看實例:
?
?
問題三:如果try中遇到的問題沒有被捕獲,怎么執(zhí)行?
答:那么程序會報錯,以紅色字體將錯誤打印在控制臺,并且下面的代碼不會繼續(xù)執(zhí)行
看實例:
?
問題四:如果try中遇到了問題,那么try下面的其他代碼還會執(zhí)行嗎?
答:不會繼續(xù)執(zhí)行
注意:這種情況就相當于try白寫了,異常就會交給JVM默認處理
看實例:
3.2.2 異常中的常見方法
在上面的案例中,當我們自己捕獲到異常時,我們會定義一個異常類的對象e,然后在catch里面隨意寫點東西,這只是為了演示方便才這樣做的。其實異常類里面有許多方法,下面就介紹幾個常用的方法:
這些方法我們都可以通過異常類對象e來調(diào)用,下面演示一個案例:
?
3.3 拋出處理
拋出處理就是自己手動寫拋出語句,將異常拋出。
拋出處理涉及到2個關(guān)鍵字,分別是 throws,throw;下面分別來看一下
3.3.1 throws
throws:寫在方法的定義處,表示聲明一個異常,作用是告訴調(diào)用者,使用本方法可能會出現(xiàn)哪些異常
注意:編譯時的異常必須要寫,運行時異??梢圆粚?/p>
格式如下:
public void 方法() throws 異常類名1,異常類名2……{
}
下面看一下具體實例:
因為沒做其他處理,所以就是默認的輸出這個異常?
3.3.2 throw
throw:寫在方法內(nèi),結(jié)束方法,它是手動拋出異常對象,交給調(diào)用者,方法下面的代碼不再執(zhí)行了
格式如下:
public void 方法{
throw new 異常類名();
}
下面看一下具體實例:
?文章來源:http://www.zghlxwxcb.cn/news/detail-430313.html
4.小結(jié)
這篇文章我們講了一下異常。介紹了什么是異常,java的異常體系結(jié)構(gòu),和對異常的三種處理方法。都比較重要,都需要掌握。其實內(nèi)容很簡單,就是出錯了,捕獲它,匹配它,處理它,然后繼續(xù)執(zhí)行后面的代碼。一般的處理方式就是輸出打印它。文章來源地址http://www.zghlxwxcb.cn/news/detail-430313.html
到了這里,關(guān)于java基礎(chǔ)知識——25.異常的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!