91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

Java兩種主要異常的差別是什么

發布時間:2021-10-23 18:12:39 來源:億速云 閱讀:99 作者:柒染 欄目:編程語言

本篇文章給大家分享的是有關Java兩種主要異常的差別是什么,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

Java提供了兩類主要的異常:runtime exception和checked exception。所有的checked exception是從java.lang.Exception類衍生出來的,而runtime exception則是從java.lang.RuntimeException或java.lang.Error類衍生出來的。

它們的不同之處表現在兩方面:機制上和邏輯上。

一、機制上

它們在機制上的不同表現在兩點:1.如何定義方法;2. 如何處理拋出的異常。請看下面CheckedException的定義:

public class CheckedException extends Exception  {   public CheckedException() {}   public CheckedException( String message )   {  super( message );   }  }

以及一個使用exception的例子:

public class ExceptionalClass  {   public void method1()  throws CheckedException  {   // ... throw new CheckedException( “...出錯了“ );  }   public void method2( String arg )  {   if( arg == null )   {  throw new NullPointerException( “method2的參數arg是null!” );   }  }   public void method3() throws CheckedException  {   method1();  }  }

你可能已經注意到了,兩個方法method1()和method2()都會拋出exception,可是只有method1()做了聲明。另外,method3()本身并不會拋出exception,可是它卻聲明會拋出CheckedException。在向你解釋之前,讓我們先來看看這個類的main()方法:

public static void main( String[] args )  {   ExceptionalClass example = new ExceptionalClass();   try  {  example.method1();  example.method3();   }   catch( CheckedException ex ) { } example.method2( null );  }

在main()方法中,如果要調用method1(),你必須把這個調用放在try/catch程序塊當中,因為它會拋出Checked exception。

相比之下,當你調用method2()時,則不需要把它放在try/catch程序塊當中,因為它會拋出的exception不是checked exception,而是runtime exception。會拋出runtime exception的方法在定義時不必聲明它會拋出exception。

現在,讓我們再來看看method3()。它調用了method1()卻沒有把這個調用放在try/catch程序塊當中。它是通過聲明它會拋出method1()會拋出的exception來避免這樣做的。它沒有捕獲這個exception,而是把它傳遞下去。實際上main()方法也可以這樣做,通過聲明它會拋出Checked exception來避免使用try/catch程序塊(當然我們反對這種做法)。

小結:

* Runtime exceptions:

在定義方法時不需要聲明會拋出runtime exception;

在調用這個方法時不需要捕獲這個runtime exception;

runtime exception是從java.lang.RuntimeException或java.lang.Error類衍生出來的。

* Checked exceptions:

定義方法時必須聲明所有可能會拋出的checked exception;

在調用這個方法時,必須捕獲它的checked exception,不然就得把它的exception傳遞下去;

checked exception是從java.lang.Exception類衍生出來的。

二、邏輯上

從邏輯的角度來說,checked exceptions和runtime exception是有不同的使用目的的。checked exception用來指示一種調用方能夠直接處理的異常情況。而runtime exception則用來指示一種調用方本身無法處理或恢復的程序錯誤。

checked exception迫使你捕獲它并處理這種異常情況。以java.net.URL類的構建器(constructor)為例,它的每一個構建器都會拋出MalformedURLException。MalformedURLException就是一種checked exception。設想一下,你有一個簡單的程序,用來提示用戶輸入一個URL,然后通過這個URL去下載一個網頁。如果用戶輸入的URL有錯誤,構建器就會拋出一個exception。既然這個exception是checked exception,你的程序就可以捕獲它并正確處理:比如說提示用戶重新輸入。

再看下面這個例子:

public void method()  {   int [] numbers = { 1, 2, 3 };   int sum = numbers[0] numbers[3];  }

在運行方法method()時會遇到ArrayIndexOutOfBoundsException(因為數組numbers的成員是從0到2)。對于這個異常,調用方無法處理/糾正。這個方法method()和上面的method2()一樣,都是runtime exception的情形。上面我已經提到,runtime exception用來指示一種調用方本身無法處理/恢復的程序錯誤。而程序錯誤通常是無法在運行過程中處理的,必須改正程序代碼。

總而言之,在程序的運行過程中一個checked exception被拋出的時候,只有能夠適當處理這個異常的調用方才應該用try/catch來捕獲它。而對于runtime exception,則不應當在程序中捕獲它。如果你要捕獲它的話,你就會冒這樣一個風險:程序代碼的錯誤(bug)被掩蓋在運行當中無法被察覺。因為在程序測試過程中,系統打印出來的調用堆棧路徑(StackTrace)往往使你更快找到并修改代碼中的錯誤。有些程序員建議捕獲runtime exception并紀錄在log中,我反對這樣做。這樣做的壞處是你必須通過瀏覽log來找出問題,而用來測試程序的測試系統(比如Unit Test)卻無法直接捕獲問題并報告出來。

在程序中捕獲runtime exception還會帶來更多的問題:要捕獲哪些runtime exception?什么時候捕獲?runtime exception是不需要聲明的,你怎樣知道有沒有runtime exception要捕獲?你想看到在程序中每一次調用方法時,都使用try/catch程序塊嗎?

以上就是Java兩種主要異常的差別是什么,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

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

AI

芒康县| 汾阳市| 阿克苏市| 南通市| 郧西县| 孟津县| 平武县| 东乌| 沙河市| 温泉县| 保定市| 北安市| 巴马| 普兰县| 阳春市| 鹰潭市| 潞城市| 曲靖市| 武川县| 靖西县| 和静县| 张家川| 从江县| 文登市| 稷山县| 南华县| 德清县| 克拉玛依市| 武威市| 大余县| 拉孜县| 都匀市| 望江县| 水城县| 阿拉善盟| 镇安县| 荆门市| 奉贤区| 璧山县| 睢宁县| 成都市|