Java_異常類(lèi)(錯(cuò)誤和異常,兩者的區(qū)別介紹)

在 Java 中,所有的異常都有一個(gè)共同的祖先 Throwable(可拋出)。Throwable 指定代碼中可用異常傳播機(jī)制通過(guò) Java 應(yīng)用程序傳輸?shù)娜魏螁?wèn)題的共性。
Throwable 有兩個(gè)重要的子類(lèi):Exception(異常)和 Error(錯(cuò)誤),二者都是 Java 異常處理的重要子類(lèi),各自都包含大量子類(lèi)。
①.Exception(異常)是應(yīng)用程序中可能的可預(yù)測(cè)、可恢復(fù)問(wèn)題。一般大多數(shù)異常表示中度到輕度的問(wèn)題。異常一般是在特定環(huán)境下產(chǎn)生的,通常出現(xiàn)在代碼的特定方法和操作中。在 EchoInput 類(lèi)中,當(dāng)試圖調(diào)用 readLine 方法時(shí),可能出現(xiàn) IOException 異常。
Exception 類(lèi)有一個(gè)重要的子類(lèi) RuntimeException。RuntimeException 類(lèi)及其子類(lèi)表示“JVM 常用操作”引發(fā)的錯(cuò)誤。例如,若試圖使用空值對(duì)象引用、除數(shù)為零或數(shù)組越界,則分別引發(fā)運(yùn)行時(shí)異常(NullPointerException、ArithmeticException)和 ArrayIndexOutOfBoundException。
②.Error(錯(cuò)誤)表示運(yùn)行應(yīng)用程序中較嚴(yán)重問(wèn)題。大多數(shù)錯(cuò)誤與代碼編寫(xiě)者執(zhí)行的操作無(wú)關(guān),而表示代碼運(yùn)行時(shí) JVM(Java 虛擬機(jī))出現(xiàn)的問(wèn)題。例如,當(dāng) JVM 不再有繼續(xù)執(zhí)行操作所需的內(nèi)存資源時(shí),將出現(xiàn) OutOfMemoryError。
檢查異常 和 未檢查異常 的劃分

Java中的異常分為兩大類(lèi):
1.Checked Exception(非Runtime Exception)
2.Unchecked Exception(Runtime Exception)
運(yùn)行時(shí)異常
RuntimeException類(lèi)是Exception類(lèi)的子類(lèi),它叫做運(yùn)行時(shí)異常,Java中的所有運(yùn)行時(shí)異常都會(huì)直接或者間接地繼承自RuntimeException類(lèi)。
Java中凡是繼承自Exception,而不繼承自RuntimeException類(lèi)的異常都是非運(yùn)行時(shí)異常。
一個(gè)try后面可以跟多個(gè)catch,但不管多少個(gè),最多只會(huì)有一個(gè)catch塊被執(zhí)行。
對(duì)于非運(yùn)行時(shí)異常(checked exception),必須要對(duì)其進(jìn)行處理,否則無(wú)法通過(guò)編譯。
處理方式有兩種:
1.使用try..catch..finally進(jìn)行捕獲;
2.在產(chǎn)生異常的方法聲明后面寫(xiě)上throws 某一個(gè)Exception類(lèi)型,如throws Exception,將異常拋出到外面一層去。
對(duì)于運(yùn)行時(shí)異常(runtime exception),可以對(duì)其進(jìn)行處理,也可以不處理。推薦不對(duì)運(yùn)行時(shí)異常進(jìn)行處理。
擴(kuò)展:錯(cuò)誤和異常的區(qū)別(Error vs Exception)
1).java.lang.Error: Throwable的子類(lèi),用于標(biāo)記嚴(yán)重錯(cuò)誤。合理的應(yīng)用程序不應(yīng)該去try/catch這種錯(cuò)誤。絕大多數(shù)的錯(cuò)誤都是非正常的,就根本不該出現(xiàn)的。
java.lang.Exception: Throwable的子類(lèi),用于指示一種合理的程序想去catch的條件。即它僅僅是一種程序運(yùn)行條件,而非嚴(yán)重錯(cuò)誤,并且鼓勵(lì)用戶(hù)程序去catch它。
2).Error和RuntimeException 及其子類(lèi)都是未檢查的異常(unchecked exceptions),而所有其他的Exception類(lèi)都是檢查了的異常(checked exceptions).
checked exceptions: 通常是從一個(gè)可以恢復(fù)的程序中拋出來(lái)的,并且最好能夠從這種異常中使用程序恢復(fù)。比如FileNotFoundException, ParseException等。檢查了的異常發(fā)生在編譯階段,必須要使用try…catch(或者throws)否則編譯不通過(guò)。
unchecked exceptions: 通常是如果一切正常的話(huà)本不該發(fā)生的異常,但是的確發(fā)生了。發(fā)生在運(yùn)行期,具有不確定性,主要是由于程序的邏輯問(wèn)題所引起的。比如ArrayIndexOutOfBoundException, ClassCastException等。從語(yǔ)言本身的角度講,程序不該去catch這類(lèi)異常,雖然能夠從諸如RuntimeException這樣的異常中catch并恢復(fù),但是并不鼓勵(lì)終端程序員這么做,因?yàn)橥耆珱](méi)要必要。因?yàn)檫@類(lèi)錯(cuò)誤本身就是bug,應(yīng)該被修復(fù),出現(xiàn)此類(lèi)錯(cuò)誤時(shí)程序就應(yīng)該立即停止執(zhí)行。 因此,面對(duì)Errors和unchecked exceptions應(yīng)該讓程序自動(dòng)終止執(zhí)行,程序員不該做諸如try/catch這樣的事情,而是應(yīng)該查明原因,修改代碼邏輯。
RuntimeException:RuntimeException體系包括錯(cuò)誤的類(lèi)型轉(zhuǎn)換、數(shù)組越界訪(fǎng)問(wèn)和試圖訪(fǎng)問(wèn)空指針等等。
處理RuntimeException的原則是:如果出現(xiàn) RuntimeException,那么一定是程序員的錯(cuò)誤。例如,可以通過(guò)檢查數(shù)組下標(biāo)和數(shù)組邊界來(lái)避免數(shù)組越界訪(fǎng)問(wèn)異常。其他(IOException等等)checked異常一般是外部錯(cuò)誤,例如試圖從文件尾后讀取數(shù)據(jù)等,這并不是程序本身的錯(cuò)誤,而是在應(yīng)用環(huán)境中出現(xiàn)的外部錯(cuò)誤。
以上這篇Java_異常類(lèi)(錯(cuò)誤和異常,兩者的區(qū)別介紹) 就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
一文詳解Java?Condition的await和signal等待通知機(jī)制
這篇文章主要為大家詳細(xì)介紹了Java?Condition的await和signal等待通知機(jī)制的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2025-02-02
SpringBoot項(xiàng)目嵌入RocketMQ的實(shí)現(xiàn)示例
本文主要介紹了SpringBoot項(xiàng)目嵌入RocketMQ的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-05-05
java子線(xiàn)程解決獲取主線(xiàn)程的request對(duì)象問(wèn)題
這篇文章主要介紹了java子線(xiàn)程解決獲取主線(xiàn)程的request對(duì)象問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
springboot項(xiàng)目部署到k8s上的方法步驟
本文主要介紹了springboot項(xiàng)目部署到k8s上的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05
如何使用jakarta.json進(jìn)行json序列化和反序列化
java里,json框架何其多,常見(jiàn)的有jackson、fastjson、gson等,本文重點(diǎn)介紹如何使用jakarta.json進(jìn)行json序列化和反序列化,需要的朋友可以參考下,2024-07-07

