中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中checked與unchecked異常的區別是什么

發布時間:2021-01-13 16:49:57 來源:億速云 閱讀:236 作者:Leah 欄目:編程語言

今天就跟大家聊聊有關Java中checked與unchecked異常的區別是什么,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

(一)Java的異常層次結構

要想明白Java中checked Exception和unchecked Exception的區別,我們首先來看一下Java的異常層次結構。

Java中checked與unchecked異常的區別是什么 

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

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

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

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

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

(三)為什么要對unchecked異常和checked異常進行區分?

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

Java中checked與unchecked異常的區別是什么

(四)我們應該對哪些異常進行聲明?

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

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

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

首先定義一個基本的異常類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);
  }
}

下面定義一個測試類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);
  }
}

運行后,在eclipse的控制臺上得到下面的信息:

 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)

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

看完上述內容,你們對Java中checked與unchecked異常的區別是什么有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

会理县| 尚义县| 石嘴山市| 金平| 仪陇县| 无为县| 云林县| 延川县| 金溪县| 布尔津县| 常宁市| 天镇县| 徐闻县| 云南省| 漾濞| 柳河县| 讷河市| 泗阳县| 新乡县| 建始县| 新沂市| 台安县| 武威市| 佛坪县| 宣恩县| 嘉定区| 甘德县| 重庆市| 琼结县| 玉山县| 合阳县| 郓城县| 上饶市| 乾安县| 毕节市| 淮滨县| 呼伦贝尔市| 佛坪县| 邵武市| 黄石市| 中江县|