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

詳解Java中的checked異常和unchecked異常區(qū)別

 更新時(shí)間:2018年02月07日 10:22:24   作者:在地圖上飛行  
這篇文章主要介紹了詳解Java中的checked異常和unchecked異常區(qū)別,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

(一)Java的異常層次結(jié)構(gòu)

要想明白Java中checked Exception和unchecked Exception的區(qū)別,我們首先來看一下Java的異常層次結(jié)構(gòu)。

這里寫圖片描述 

這是一個(gè)簡化的Java異常層次結(jié)構(gòu)示意圖,需要注意的是所有的類都是從Throwable繼承而來,下一層則分為兩個(gè)結(jié)構(gòu),Error和Exception。其中Error類層次描述了Java運(yùn)行時(shí)系統(tǒng)的內(nèi)部錯(cuò)誤和資源耗盡錯(cuò)誤,這種錯(cuò)誤除了簡單的報(bào)告給用戶,并盡力阻止程序安全終止之外,一般也米有別的解決辦法了。

(二)unchecked異常和checked異常的區(qū)別

有了上面的認(rèn)識(shí)之后,我們再來看什么是checked異常,什么是unchecked的異常。其實(shí),Java語言規(guī)范對這兩個(gè)定義十分簡單,將派生于Error或者RuntimeException的異常稱為unchecked異常,所有其他的異常成為checked異常。盡管,這個(gè)定義十分簡單,但是RuntimeException卻是一個(gè)非常讓人容易混淆的觀念,似乎我們所有的異常都是在程序運(yùn)行的過程中。我《Effective Java》中關(guān)于Ru ntimeException異常的闡述也不是那么盡如人意,

Use checked exceptions for recoverable conditions and runtime exceptions for programming errors (Item 58 in 2nd edition)

不過從這句話中我們可以簡單引申一下,也就是說,如果出現(xiàn)了RuntimeException,就一定是程序員自身的問題。比如說,數(shù)組下標(biāo)越界和訪問空指針異常等等,只要你稍加留心這些異常都是在編碼階段可以避免的異常。如果你還是覺得這兩個(gè)概念不好區(qū)分,那么“最暴力“的方法就是將常見的RuntimeException背下來,這樣就可以省去很多判斷的時(shí)間。

(三)為什么要對unchecked異常和checked異常進(jìn)行區(qū)分?

原因其實(shí)很簡單,編譯器將檢查你是否為所有的已檢查異常提供了異常處理機(jī)制,比如說我們使用Class.forName()來查找給定的字符串的class對象的時(shí)候,如果沒有為這個(gè)方法提供異常處理,編譯是無法通過的。

這里寫圖片描述

(四)我們應(yīng)該對哪些異常進(jìn)行聲明?

我們前面說,RuntimeException是在programing過程中可以避免的錯(cuò)誤,那是不是我們就不需要拋出這些異常呢?原則上來說,是這樣的,但是Java規(guī)范中并沒有對此進(jìn)行限制,只是看上去你拋出一個(gè)數(shù)組越界的異常并沒有多少實(shí)際意義,相反還會(huì)對性能造成一定的損失。那么我們應(yīng)該如何來設(shè)計(jì)拋出異常呢?我們要記住以下兩種情況是必聲明throws異常的:

調(diào)用一個(gè)checked異常的方法,例如IOException,至于原因我們前面已經(jīng)討論過了,如果拋出所有的checked異常時(shí)無法通過編譯的。程序運(yùn)行過程中發(fā)現(xiàn)錯(cuò)誤,利用throw語句拋出一個(gè)異常。對于unchecked異常,無非主要是兩種情況要么是可以避免的(Runtime Exception),要么是不可控制的。這些也是需要聲明異常的。

下面列舉例子說明上面的注意事項(xiàng)2中提到的比較別扭的地方:

首先定義一個(gè)基本的異常類GenericException,繼承于Exception。

package check_unchecked_exceptions;

public class GenericException extends Exception{

  /**
   * 
   */
  private static final long serialVersionUID = 2778045265121433720L;
  
  public GenericException(){
    
  }
  
  public GenericException(String msg){
    super(msg);
  }
}

下面定義一個(gè)測試類VerifyException。

package check_unchecked_exceptions;

public class VerifyException {

  public void first() throws GenericException {
    throw new GenericException("checked exception");
  }
  
  public void second(String msg){
    if(msg == null){
      throw new NullPointerException("unchecked exception");
    }
  }
  
  public void third() throws GenericException{
    first();
  }
  
  public static void main(String[] args) {
    VerifyException ve = new VerifyException();
    
    try {
      ve.first();
    } catch (GenericException e) {
      e.printStackTrace();
    }

    ve.second(null);
  }
}

運(yùn)行后,在eclipse的控制臺(tái)上得到下面的信息:

 check_unchecked_exceptions.GenericException: checked exception
     at check_unchecked_exceptions.VerifyException.first(VerifyException.java:6)
     at check_unchecked_exceptions.VerifyException.main(VerifyException.java:23)
 Exception in thread "main" java.lang.NullPointerException: unchecked exception
     at check_unchecked_exceptions.VerifyException.second(VerifyException.java:11)
     at check_unchecked_exceptions.VerifyException.main(VerifyException.java:29)

上面的例子,結(jié)合checked以及unchecked的概念,可以看出Exception這個(gè)父類是checked類型,但是其子類RuntimeException (子類NullPointerException)卻是unchecked的。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python爬蟲 12306搶票開源代碼過程詳解

    Python爬蟲 12306搶票開源代碼過程詳解

    這篇文章主要介紹了Python爬蟲 12306搶票開源代碼過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • JavaWeb實(shí)體類轉(zhuǎn)為json對象的實(shí)現(xiàn)方法

    JavaWeb實(shí)體類轉(zhuǎn)為json對象的實(shí)現(xiàn)方法

    這篇文章主要介紹了JavaWeb實(shí)體類轉(zhuǎn)為json對象的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • SpringBoot集成Beetl后統(tǒng)一處理頁面異常的方法

    SpringBoot集成Beetl后統(tǒng)一處理頁面異常的方法

    這篇文章主要介紹了SpringBoot集成Beetl后統(tǒng)一處理頁面異常的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • flink進(jìn)階富函數(shù)生命周期介紹

    flink進(jìn)階富函數(shù)生命周期介紹

    這篇文章主要為大家介紹了flink進(jìn)階富函數(shù)生命周期的舉例介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • springboot logback如何從apollo配置中心讀取變量

    springboot logback如何從apollo配置中心讀取變量

    這篇文章主要介紹了springboot logback如何從apollo配置中心讀取變量的操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 基于紅黑樹插入操作原理及java實(shí)現(xiàn)方法(分享)

    基于紅黑樹插入操作原理及java實(shí)現(xiàn)方法(分享)

    下面小編就為大家分享一篇基于紅黑樹插入操作原理及java實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • SpringBoot自動(dòng)裝配原理以及分析

    SpringBoot自動(dòng)裝配原理以及分析

    這篇文章主要介紹了SpringBoot自動(dòng)裝配原理以及分析,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Mybatis返回結(jié)果封裝map過程解析

    Mybatis返回結(jié)果封裝map過程解析

    這篇文章主要介紹了Mybatis返回結(jié)果封裝map過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Java中注解的常見用法總結(jié)

    Java中注解的常見用法總結(jié)

    注解(Annotation),也叫元數(shù)據(jù),是JDK1.5及以后版本引入的一個(gè)特性,本文主要為大家介紹了注解的常見用法,需要的小伙伴可以參考一下
    2023-07-07
  • Spring mvc JSON數(shù)據(jù)交換格式原理解析

    Spring mvc JSON數(shù)據(jù)交換格式原理解析

    這篇文章主要介紹了Spring mvc JSON數(shù)據(jù)交換格式原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03

最新評(píng)論