欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java異常繼承結(jié)構(gòu)解析_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

 更新時(shí)間:2017年04月24日 09:56:15   投稿:mrr  
這篇文章主要介紹了Java異常繼承結(jié)構(gòu)解析的相關(guān)知識(shí),需要的朋友可以參考下

Java異常類層次結(jié)構(gòu)圖: 

異常的英文單詞是exception,字面翻譯就是“意外、例外”的意思,也就是非正常情況。事實(shí)上,異常本質(zhì)上是程序上的錯(cuò)誤,包括程序邏輯錯(cuò)誤和系統(tǒng)錯(cuò)誤。比如使用空的引用、數(shù)組下標(biāo)越界、內(nèi)存溢出錯(cuò)誤等,這些都是意外的情況,背離我們程序本身的意圖。錯(cuò)誤在我們編寫程序的過程中會(huì)經(jīng)常發(fā)生,包括編譯期間和運(yùn)行期間的錯(cuò)誤,在編譯期間出現(xiàn)的錯(cuò)誤有編譯器幫助我們一起修正,然而運(yùn)行期間的錯(cuò)誤便不是編譯器力所能及了,并且運(yùn)行期間的錯(cuò)誤往往是難以預(yù)料的。假若程序在運(yùn)行期間出現(xiàn)了錯(cuò)誤,如果置之不理,程序便會(huì)終止或直接導(dǎo)致系統(tǒng)崩潰,顯然這不是我們希望看到的結(jié)果。因此,如何對(duì)運(yùn)行期間出現(xiàn)的錯(cuò)誤進(jìn)行處理和補(bǔ)救呢?Java提供了異常機(jī)制來進(jìn)行處理,通過異常機(jī)制來處理程序運(yùn)行期間出現(xiàn)的錯(cuò)誤。通過異常機(jī)制,我們可以更好地提升程序的健壯性。

  unchecked exception(非檢查異常),也稱運(yùn)行時(shí)異常(RuntimeException),比如常見的NullPointerException、IndexOutOfBoundsException。對(duì)于運(yùn)行時(shí)異常,Java編譯器不要求必須進(jìn)行異常捕獲處理或者拋出聲明,由程序員自行決定。 

    checked exception(檢查異常,編譯異常),也稱非運(yùn)行時(shí)異常(運(yùn)行時(shí)異常以外的異常就是非運(yùn)行時(shí)異常),java編譯器強(qiáng)制程序員必須進(jìn)行捕獲處理,比如常見的IOExeption和SQLException。對(duì)于非運(yùn)行時(shí)異常如果不進(jìn)行捕獲或者拋出聲明處理,編譯都不會(huì)通過。 

   Throwable: 有兩個(gè)重要的子類:Exception(異常)和 Error(錯(cuò)誤),二者都是 Java 異常處理的重要子類,各自都包含大量子類。   

   Error(錯(cuò)誤):是程序無法處理的錯(cuò)誤,表示運(yùn)行應(yīng)用程序中較嚴(yán)重問題。大多數(shù)錯(cuò)誤與代碼編寫者執(zhí)行的操作無關(guān),而表示代碼運(yùn)行時(shí) JVM(Java 虛擬機(jī))出現(xiàn)的問題。例如,Java虛擬機(jī)運(yùn)行錯(cuò)誤(Virtual MachineError),當(dāng) JVM 不再有繼續(xù)執(zhí)行操作所需的內(nèi)存資源時(shí),將出現(xiàn) OutOfMemoryError。這些異常發(fā)生時(shí),Java虛擬機(jī)(JVM)一般會(huì)選擇線程終止。這些錯(cuò)誤表示故障發(fā)生于虛擬機(jī)自身、或者發(fā)生在虛擬機(jī)試圖執(zhí)行應(yīng)用時(shí),如Java虛擬機(jī)運(yùn)行錯(cuò)誤(Virtual MachineError)、類定義錯(cuò)誤(NoClassDefFoundError)等。這些錯(cuò)誤是不可查的,因?yàn)樗鼈冊(cè)趹?yīng)用程序的控制和處理能力之 外,而且絕大多數(shù)是程序運(yùn)行時(shí)不允許出現(xiàn)的狀況。對(duì)于設(shè)計(jì)合理的應(yīng)用程序來說,即使確實(shí)發(fā)生了錯(cuò)誤,本質(zhì)上也不應(yīng)該試圖去處理它所引起的異常狀況。在 Java中,錯(cuò)誤通過Error的子類描述。 

   Exception(異常):是程序本身可以處理的異常。 Exception 類有一個(gè)重要的子類 RuntimeException。RuntimeException 類及其子類表示“JVM 常用操作”引發(fā)的錯(cuò)誤。例如,若試圖使用空值對(duì)象引用、除數(shù)為零或數(shù)組越界,則分別引發(fā)運(yùn)行時(shí)異常(NullPointerException、ArithmeticException)和 ArrayIndexOutOfBoundException。

注意:

異常和錯(cuò)誤的區(qū)別:異常能被程序本身可以處理,錯(cuò)誤是無法處理。

通常,Java的異常(包括Exception和Error)分為可查的異常(checked exceptions)和不可查的異常(unchecked exceptions)。

   可查異常(編譯器要求必須處置的異常):正確的程序在運(yùn)行中,很容易出現(xiàn)的、情理可容的異常狀況??刹楫惓km然是異常狀況,但在一定程度上它的發(fā)生是可以預(yù)計(jì)的,而且一旦發(fā)生這種異常狀況,就必須采取某種方式進(jìn)行處理。

除了RuntimeException及其子類以外,其他的Exception類及其子類都屬于可查異常。這種異常的特點(diǎn)是Java編譯器會(huì)檢查它,也就是說,當(dāng)程序中可能出現(xiàn)這類異常,要么用try-catch語句捕獲它,要么用throws子句聲明拋出它,否則編譯不會(huì)通過。

應(yīng)該catch什么

其實(shí)只要是Throwable和其子類都是可以throw和catch的,那么如果在需要統(tǒng)一處理異常的地方,我們應(yīng)該catch (Throwable th) 還是 catch (Exception)呢?

這兩種處理的區(qū)別在于,catch throwable會(huì)把Error和其他繼承Throwable的類捕捉到。而catch Exception只會(huì)捕捉Exception極其子類,捕捉的范圍更小。先不考慮有其他的類繼承了Throwable的情況下,第一種catch相當(dāng)于比第二種catch多捕捉了把Error和其子類。

那么究竟Error是否需要捕捉呢?JDK中Error類的的注釋(如下)里提到過,Error是一種嚴(yán)重的問題,應(yīng)用程序不應(yīng)該捕捉它。

  An Error is a subclass of Throwable that indicates serious problems that a reasonable application should not try to catch. Most such errors are abnormal conditions. The ThreadDeath error, though a “normal” condition, is also a subclass of Error because most applications should not try to catch it.
A method is not required to declare in its throws clause any subclasses of Error that might be thrown during the execution of the method but not caught, since these errors are abnormal conditions that should never occur.

Java Lanuage Spec 7 中也提到:Error繼承自Throwable而不是繼承自Exception,是為了方便程序可以使用 “catch (Exception)“來捕捉異常而不會(huì)把Error也捕捉在內(nèi),因?yàn)镋xception發(fā)生后可以進(jìn)行一些恢復(fù)工作的,但是Error發(fā)生后一般是不可恢復(fù)的。

The class Error is a separate subclass ofThrowable, distinct from Exception in the class 
hierarchy, to allow programs to use the idiom “} catch (Exception e) { ” (§11.2.3) 
to catch all exceptions from which recovery may be possible without catching errors from which recovery is typically not possible.

  已經(jīng)不難看出,Java本身設(shè)計(jì)思路就是希望大家catch Exception就足夠了,如果有Error發(fā)生,catch了也不會(huì)有什么作用。

Error可以catch嗎? 可以catch了后做些其他處理嗎?

Error是可以catch的,而且也可以向常規(guī)Exception一樣被處理,而且就算不捕捉的話也只是導(dǎo)致當(dāng)前線程掛掉,其他線程還是可以正常運(yùn)行,如果有需要的話捕捉Error之后也可以做些其他處理。但是Error是一種系統(tǒng)內(nèi)部的錯(cuò)誤,這種錯(cuò)誤不像Exception一樣是可能是程序和業(yè)務(wù)上的錯(cuò)誤是可以恢復(fù)的。

以上所述是小編給大家介紹的Java異常繼承結(jié)構(gòu)解析_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • 解讀springboot配置mybatis的sql執(zhí)行超時(shí)時(shí)間(mysql)

    解讀springboot配置mybatis的sql執(zhí)行超時(shí)時(shí)間(mysql)

    這篇文章主要介紹了解讀springboot配置mybatis的sql執(zhí)行超時(shí)時(shí)間(mysql),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • SpringBoot?替換?if?的參數(shù)校驗(yàn)示例代碼

    SpringBoot?替換?if?的參數(shù)校驗(yàn)示例代碼

    Spring?Validation是對(duì)hibernate?validation的二次封裝,用于支持spring?mvc參數(shù)自動(dòng)校驗(yàn),接下來,我們以spring-boot項(xiàng)目為例,介紹Spring?Validation的使用,需要的朋友可以參考下
    2022-12-12
  • Spring Transaction事務(wù)實(shí)現(xiàn)流程源碼解析

    Spring Transaction事務(wù)實(shí)現(xiàn)流程源碼解析

    此文就Spring 事務(wù)實(shí)現(xiàn)流程進(jìn)行源碼解析,我們可以借此對(duì)Spring框架更多一層理解,下面以xml形式創(chuàng)建一個(gè)事務(wù)進(jìn)行分析
    2022-09-09
  • 詳解Java反射實(shí)現(xiàn)Aop代理

    詳解Java反射實(shí)現(xiàn)Aop代理

    本篇文章主要介紹了Java 反射實(shí)現(xiàn) Aop 代理,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-03-03
  • Jmeter內(nèi)置變量vars和props的使用詳解

    Jmeter內(nèi)置變量vars和props的使用詳解

    JMeter是一個(gè)功能強(qiáng)大的負(fù)載測(cè)試工具,它提供了許多有用的內(nèi)置變量來支持測(cè)試過程,其中最常用的變量是 vars 和 props,本文通過代碼示例詳細(xì)給大家介紹了Jmeter內(nèi)置變量vars和props的使用,需要的朋友可以參考下
    2024-08-08
  • Maven build 命令介紹的使用詳解

    Maven build 命令介紹的使用詳解

    這篇文章主要介紹了Maven build 命令介紹的使用詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • IntelliJ IDEA 2021.1 推出語音、視頻功能,邊寫代碼邊聊天(功能超級(jí)強(qiáng)大)

    IntelliJ IDEA 2021.1 推出語音、視頻功能,邊寫代碼邊聊天(功能超級(jí)強(qiáng)大

    這篇文章主要介紹了IntelliJ IDEA 2021.1 推出語音、視頻功能,邊寫代碼邊聊天(功能超級(jí)強(qiáng)大),本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • Java實(shí)現(xiàn)圖像分割功能

    Java實(shí)現(xiàn)圖像分割功能

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)圖像分割功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • 簡(jiǎn)單分析java中CMS回收器

    簡(jiǎn)單分析java中CMS回收器

    在本篇文章里我們給大家分享了關(guān)于java中CMS回收器的相關(guān)知識(shí)點(diǎn)內(nèi)容,有需要的朋友們可以跟著學(xué)習(xí)下。
    2018-10-10
  • JavaEE中struts2實(shí)現(xiàn)文件上傳下載功能實(shí)例解析

    JavaEE中struts2實(shí)現(xiàn)文件上傳下載功能實(shí)例解析

    這篇文章主要為大家詳細(xì)介紹了JavaEE中struts2實(shí)現(xiàn)文件上傳下載功能實(shí)例,感興趣的小伙伴們可以參考一下
    2016-05-05

最新評(píng)論