java異常處理高級(jí)技巧
什么是Java異常?
當(dāng)Java程序的正常行為被意外行為中斷時(shí),會(huì)發(fā)生故障。這種故障被稱為異常。例如,程序嘗試打開(kāi)文件以讀取其內(nèi)容,但該文件不存在將產(chǎn)生異常。Java將異常分為幾種類型,所以讓我們考慮每一種類型。
檢查異常
Java將(例如FileNotFoundException, IOException)引起的異常分類為已檢查的異常。Java編譯器會(huì)檢查這些異常,并且在異常發(fā)生的位置要求進(jìn)行捕獲處理或者向上拋出(throws)。需要注意的是檢查異常屬于編譯器的行為,要求你必須在代碼中捕獲或向上拋出(throws)。
運(yùn)行時(shí)(非檢查)異常
例如程序進(jìn)行強(qiáng)制轉(zhuǎn)換(cast),這種可能存在轉(zhuǎn)換失敗的異常就是另一種異常。即運(yùn)行時(shí)異常(RuntimeException)。和檢查不同,編譯器不會(huì)檢查你在代碼中是否進(jìn)行處理或拋出。運(yùn)行時(shí)異常通常來(lái)自編寫(xiě)的不良代碼,因此應(yīng)由程序員修復(fù)。
錯(cuò)誤(Error)
指一些非常嚴(yán)重,通常無(wú)法進(jìn)行修正必須要重啟程序的異常。例如, 嘗試從JVM分配內(nèi)存,但沒(méi)有足夠的可用內(nèi)存來(lái)滿足請(qǐng)求(OutOfMemoryError)。運(yùn)行時(shí)嘗試調(diào)用加載類文件但類文件但無(wú)法找到時(shí)(NoClassDefFoundError)。對(duì)于錯(cuò)誤您永遠(yuǎn)不應(yīng)該嘗試捕獲并自己處理錯(cuò)誤,因?yàn)镴VM可能已經(jīng)無(wú)法從中恢復(fù)正常。
Throwable及其子類
Java提供了表示不同類型異常的類層次結(jié)構(gòu)。java.lang包的Throwable類是所有異常類的超類。
注意:通常您不應(yīng)該以任何方式捕獲和處理Throwable。
Exception類
Throwable有兩個(gè)直接的子類。其中一個(gè)子類是Exception。Java提供了許多直接子類的異常類Exception。比如:
SQLException 表示發(fā)生了jdbc異常,來(lái)自java.sql包中IOException 表示發(fā)生了I/O異常,來(lái)自java.io包中注意,每個(gè)Exception子類名稱都以Exception單詞結(jié)尾。該約定使得易于識(shí)別該類異常。
您可能想自定義使用自己的Exception檢查異常。下面自定義示例:
Error類
Throwable另一個(gè)直接的子類是Error,描述了一個(gè)合理的應(yīng)用程序不應(yīng)該嘗試處理的嚴(yán)重問(wèn)題 - 例如內(nèi)存不足溢出,棧溢出,或者嘗試加載無(wú)法找到的類。例如:
OutOfMemoryError 內(nèi)存溢出StackOverflowError 棧溢出NoClassDefFoundError 嘗試加載無(wú)法找到的類時(shí)觸發(fā)注意:通常您不應(yīng)該以任何方式捕獲和處理Error類異常。
RuntimeException類
RuntimeException異常或其子類實(shí)例化是未經(jīng)檢查的異常。直接父類是Exception。RuntimeException和其分類Exception 聲明相同的構(gòu)造函數(shù)(具有相同的參數(shù)列表)。它通常表示一個(gè)可能由不良代碼引起的運(yùn)行時(shí)異常。下面是它的一些示例:
NullPointerException 空指針異常,java最常見(jiàn)異常。過(guò)多的該異常通常意味您需要提高代碼編寫(xiě)技巧。IllegalArgumentException 驗(yàn)證異常,通常表示參數(shù)非法或不正確的狀態(tài)。ClassCastException 類型轉(zhuǎn)換異常NullPointerException異常優(yōu)化:
嘗試使用java.util.Optional<T>作為方法返回值,使用Optional.empty()取代return null;使用將字符串放在前面 "str".equals(arg)做好方法或構(gòu)造函數(shù)的入?yún)z查。this.args = Objects.requireNonNull(inArgs, "inArgs is null");返回空集合而不是null。return new String[0] or return Collections.emptyMap()方法入?yún)⒑头祷厥褂?long,int 而非包裝類 Intger,Long異常拋出
C語(yǔ)言通常return全局錯(cuò)誤變量來(lái)通常調(diào)用者。而java則使用拋出異常對(duì)象來(lái)通知調(diào)用者。了解如何以及何時(shí)拋出異常是Java編程一個(gè)非常重要技能。通常您只拋出Exception或RuntimeException的子類實(shí)例化的對(duì)象。拋出異常有兩個(gè)步驟。
使用throw new 異常語(yǔ)句拋出異常對(duì)象。在方法上使用throws 異常語(yǔ)句告知編譯器(對(duì)于檢查異常這是必須的)。throw拋出異常:
異常拋出是指將異常對(duì)象從當(dāng)前方法拋出到JVM。然后JVM會(huì)在異常表中查找合適異常處理邏輯(catch)。如何沒(méi)有找到則JVM會(huì)退出當(dāng)前方法的調(diào)用棧,從上級(jí)調(diào)用者(方法)的異常表中繼續(xù)尋找。如果找到它將使用該處理代碼進(jìn)行處理異常。如果JVM最后在main()方法的異常表中依然沒(méi)有找到合適處理邏輯(catch)那么JVM將會(huì)發(fā)出消息-1然后退出。
注意: 異常處理通常非常昂貴,您不該在任何時(shí)候使用異常處理邏輯來(lái)處理您的正常業(yè)務(wù)
throws告知編譯器:
從方法中拋出檢查異常時(shí),需要在方法上添加拋出標(biāo)志來(lái)通知編譯器。
總結(jié)
該篇文檔總結(jié)java異常的分類和各自的特點(diǎn)。下面是一些關(guān)鍵點(diǎn)總結(jié):
強(qiáng)制你處理或拋出檢查異常屬于編譯器的行為,對(duì)于它編譯器要求你必須在代碼中捕獲或向上拋出(throws)。永遠(yuǎn)不要試圖catch Error錯(cuò)誤嘗試捕獲并自己處理錯(cuò)誤,因?yàn)镴VM可能已經(jīng)無(wú)法從中恢復(fù)正常。永遠(yuǎn)不要以任何方式直接catch捕獲和處理Throwable, 因?yàn)镋rror是它子類。異常處理通常代價(jià)非常昂貴,不要試圖用來(lái)處理您的正常業(yè)務(wù)。過(guò)多的NullPointerException異常意味著你需要提高代碼編寫(xiě)技巧。本文發(fā)布于:2023-02-28 21:07:00,感謝您對(duì)本站的認(rèn)可!
本文鏈接:http://m.newhan.cn/zhishi/a/167772757699886.html
版權(quán)聲明:本站內(nèi)容均來(lái)自互聯(lián)網(wǎng),僅供演示用,請(qǐng)勿用于商業(yè)和其他非法用途。如果侵犯了您的權(quán)益請(qǐng)與我們聯(lián)系,我們將在24小時(shí)內(nèi)刪除。
本文word下載地址:illegalargument.doc
本文 PDF 下載地址:illegalargument.pdf
| 留言與評(píng)論(共有 0 條評(píng)論) |