Java之異常處理

2020-09-04 JAVAbx

異常的定義

異常:在Java語言中,將程序執行中發生的不正常情況稱為「異常」。 (開發過程中的語法錯誤和邏輯錯誤不是異常)

1. 異常的體系結構

Java程序在執行過程中所發生的異常事件可分為兩類:

  1. Error: Java虛擬機無法解決的嚴重問題。如:JVM系統內部錯誤、資源耗盡等嚴重情況。比如: StackOverflowError和OOM。一般不編寫針對性的代碼進行處理。
  2. Exception:其它因編程錯誤或偶然的外在因素導致的一般性問題,可以使用針對性的代碼進行處理。例如:空指針訪問試圖讀取不存在的文件網絡連接中斷數組角標越界

異常的體系結構 * java.lang.Throwable * |-----java.lang.Error:一般不編寫針對性的代碼進行處理。 * |-----java.lang.Exception:可以進行異常的處理 * |------編譯時異常(checked)不會生成字節碼文件 * |-----IOException * |-----FileNotFoundException * |-----ClassNotFoundException * |------運行時異常(unchecked,RuntimeException) * |-----NullPointerException//空指針異常 * |-----ArrayIndexOutOfBoundsException//數組角標越界 * |-----ClassCastException//類型轉化異常 * |-----NumberFormatException//編碼格式異常 * |-----InputMismatchException//輸入不匹配 * |-----ArithmeticException//算術異常

java中異常類的繼承關係

2. 按照異常發生的時間可以分為兩類

  1. 編譯時異常:執行javac.exe命名時,可能出現的異常 是指編譯器不要求強制處置的異常。一般是指編程時的邏輯錯誤,是程式設計師應該積極避免其出現的異常。 java. lang. Runtime Exception類及它的子類都是運行時異常。 對於這類異常,可以不作處理,因為這類異常很普遍,若全處理可能會對程序的可讀性和運行效率產生影響
  2. 運行時異常:執行java.exe命名時,出現的異常 是指編譯器要求必須處置的異常。即程序在運行時由於外界因素造成的一般性異常。編譯器要求Java程序必須捕獲或聲明所有編譯時異常對於這類異常,如果程序不處理,可能會帶來意想不到的結果。

3.常見的異常類型

//******************以下是運行時異常*************************** //ArithmeticException @Test public void test6(){ int a = 10; int b = 0; System.out.println(a / b); } //InputMismatchException @Test public void test5(){ Scanner scanner = new Scanner(System.in); int score = scanner.nextInt(); System.out.println(score); scanner.close(); } //NumberFormatException @Test public void test4(){ String str = &34;; str = &34;; int num = Integer.parseInt(str); } //ClassCastException @Test public void test3(){ Object obj = new Date(); String str = (String)obj; } //IndexOutOfBoundsException @Test public void test2(){ //ArrayIndexOutOfBoundsException// int[] arr = new int[10];// System.out.println(arr[10]); //StringIndexOutOfBoundsException String str = &34;; System.out.println(str.charAt(3)); } //NullPointerException @Test public void test1(){ // int[] arr = null;// System.out.println(arr[3]); String str = &34;; str = null; System.out.println(str.charAt(0)); } //******************以下是編譯時異常*************************** @Test public void test7(){// File file = new File(&34;);// FileInputStream fis = new FileInputStream(file);// // int data = fis.read();// while(data != -1){// System.out.print((char)data);// data = fis.read();// }// // fis.close(); }

異常的處理

1. java異常處理的抓拋模型

過程一:&34;:程序在正常執行的過程中,一旦出現異常,就會在異常代碼處生成一個對應異常類的對象。並將此對象拋出。一旦拋出對象以後,其後的代碼就不再執行。

關於異常對象的產生:

① 系統自動生成的異常對象

② 手動的生成一個異常對象,並拋出(throw)

過程二:&34;:可以理解為異常的處理方式:① try-catch-finally ② throws

2.異常處理方式一:try-catch-finally

2.1 使用說明:

try{ //可能出現異常的代碼 }catch(異常類型1 變量名1){ //處理異常的方式1}catch(異常類型2 變量名2){ //處理異常的方式2}catch(異常類型3 變量名3){ //處理異常的方式3} ....finally{ //一定會執行的代碼}

說明:

  1. finally是可選的。
  2. 使用try將可能出現異常代碼包裝起來,在執行過程中,一旦出現異常,就會生成一個對應異常類的對象,根據此對象的類型,去catch中進行匹配
  3. 一旦try中的異常對象匹配到某一個catch時,就進入catch中進行異常的處理。一旦處理完成,就跳出當前的try-catch結構(在沒寫finally的情況。繼續執行其後的代碼)
  4. catch中的異常類型如果沒子父類關係,則誰聲明在上,誰聲明在下無所謂。catch中的異常類型如果滿足子父類關係,則要求子類一定聲明在父類的上面。否則,報錯
  5. 常用的異常對象處理的方式: ① String getMessage() ② printStackTrace()
  6. 在try結構中聲明的變量,再出了try結構以後,就不能再被調用
  7. try-catch-finally結構可以嵌套

如何看待代碼中的編譯時異常和運行時異常?

  1. 使用try-catch-finally處理編譯時異常,使得程序在編譯時就不再報錯,但是運行時仍可能報錯。相當於我們使用try-catch-finally將一個編譯時可能出現的異常,延遲到運行時出現。
  2. 開發中,由於運行時異常比較常見,所以我們通常就不針對運行時異常編寫try-catch-finally了。==針對於編譯時異常,我們說一定要考慮異常的處理==。

2.2. finally的再說明:

  1. finally是可選的
  2. finally中聲明的是一定會被執行的代碼。即使catch中又出現異常了,try中return語句,catch中return語句等情況。
  3. 像資料庫連接、輸入輸出流、網絡編程Socket等資源,JVM是不能自動的回收的,我們需要自己手動的進行資源的釋放。此時的資源釋放,就需要聲明在finally中。

3. 異常處理方式二:

&34;==寫在方法的聲明處==。指明此方法執行時,可能會拋出的異常類型。 一旦當方法體執行時,出現異常,仍會在異常代碼處生成一個異常類的對象,此對象滿足throws後異常類型時,就會被拋出。異常代碼後續的代碼,就不再執行!

4. 對比兩種處理方式

try-catch-finally:真正的將異常給處理掉了。 throws的方式只是將異常拋給了方法的調用者。==並沒真正將異常處理掉==。

5. 開發中應該如何選擇兩種處理方式?

  • 如果父類中被重寫的方法沒throws方式處理異常,則子類重寫的方法也不能使用throws,意味著如果子類重寫的方法中異常,必須使用try-catch-finally方式處理。
  • 執行的方法a中,先後又調用了另外的幾個方法,這幾個方法是遞進關係執行的。我們建議這幾個方法使用throws的方式進行處理。而執行的方法a可以考慮使用try-catch-finally方式進行處理。

補充: 方法重寫的規則之一: 子類重寫的方法拋出的異常類型不大於父類被重寫的方法拋出的異常類型

手動拋出異常對象

1.使用說明

在程序執行中,除了自動拋出異常對象的情況之外,我們還可以手動的throw一個異常類的對象。

2.經典面試題

throw 和 throws區別: throw 表示拋出一個異常類的對象,生成異常對象的過程。聲明在方法體內。 throws 屬於異常處理的一種方式,聲明在方法的聲明處。

3.代碼示例

class Student{ private int id; public void regist(int id) throws Exception { if(id > 0){ this.id = id; }else{ //手動拋出異常對象// throw new RuntimeException(&34;);// throw new Exception(&34;); throw new MyException(&34;); } } @Override public String toString() { return &34; + id + &34;; } }

自定義異常類

1.如何自定義異常類

  1. 繼承於現的異常結構:RuntimeException 、Exception
  2. 提供全局常量:serialVersionUID(對類的唯一標識)
  3. 提供重載的構造器

2.代碼示例

public class MyException extends Exception{ static final long serialVersionUID = -7034897193246939L; public MyException(){ } public MyException(String msg){ super(msg); }}


轉自:https://my.oschina.net/RealBruce/blog/3218016

相關焦點

  • java安全編碼指南之:異常處理
    簡介異常是java程式設計師無法避免的一個話題,我們會有JVM自己的異常也有應用程式的異常,對於不同的異常,我們的處理原則是不是一樣的呢?第一種就是按照業務邏輯處理異常,第二種就是本身並不處理異常,但是將異常再次拋出,由上層代碼來處理。如果捕獲了,但是不處理,那麼就是忽略checked exceptions。
  • Java基礎之異常處理機制
    Java基礎之異常處理機制什麼是異常從事Java開發的小夥伴對於「異常」應該不陌生,因為每天都會遇到不少異常,或捕獲,或拋出。異常處理機制可以讓程序有更好的容錯性,使代碼更加健壯;但C語言卻沒有異常處理機制,C程式設計師一般都是利用方法的返回值來實現異常處理,使用 if + 條件 來判斷正常和異常情況,使用特定返回值來表示異常情況。
  • Java學習(十二): 異常處理
    異常概述Java的異常處理機制也秉承著面向對象的基本思想。在Java中,所有的異常都是以類的類型存在。除了內置的異常類之外,Java也可以自定義異常類。此外,Java的異常處理機制也允許自定義拋出異常。
  • java NullPointerException異常處理
    java語言與其他程式語言不同,它有嚴格的異常處理機制,如果需要拋出異常的代碼塊中沒有捕獲異常,程序將不會成功編譯,換言之:未使用異常捕獲、異常捕獲方式不正確等,都將導致代碼不能被jvm編譯。java標準庫,內建了大量的異常處理類,這些類以Throwable 設計為最頂層類。
  • java中的try是什麼?|java的異常處理類型
    1、try-是java異常處理類型中的一個。那麼,異常處理又是啥?2、異常-說的就是編寫程序時出現的錯誤。2.1:java提供異常處理類Throwable2.2:Throwable類分為Error和Exception兩個子類2.3:Error由java本身來處理2.4:我們要捕獲和拋出的異常是Exception這類的異常
  • JAVA異常及其異常處理方式
    異常處理異常是程序中的一些錯誤,但並不是所有的錯誤都是異常,並且錯誤有時候是可以避免的。比如說,你的代碼少了一個分號,那麼運行出來結果是提示是錯誤 java.lang.Error;如果你用System.out.println(100/0),那麼你是因為你用0做了除數,會拋出 java.lang.ArithmeticException 的異常。
  • 處理Java異常的9個最佳實踐
    本文由程式設計師新視界原創翻譯英文原文連結:https://dzone.com/articles/9-best-practices-to-handle-exceptions-in-java說起Java異常處理,心情就變得沉重起來。
  • Java提高篇——Java中的異常處理(絕對詳細,建議收藏)
    異常的體系結構Java把異常當作對象來處理,並定義一個基類java.lang.Throwable作為所有異常的超類。這些異常發生時,Java虛擬機(JVM)一般會選擇線程終止;還有發生在虛擬機試圖執行應用時,如類定義錯誤(NoClassDefFoundError)、連結錯誤(LinkageError)。這些錯誤是不可查的,因為它們在應用程式的控制和處理能力之 外,而且絕大多數是程序運行時不允許出現的狀況。對於設計合理的應用程式來說,即使確實發生了錯誤,本質上也不應該試圖去處理它所引起的異常狀況。
  • Java中異常處理的9個最佳實踐
    因此在進入探討異常處理最佳實踐的正題之前,我們首先需要解決兩個問題:什麼是異常和異常處理?為什麼需要它們?異常及異常處理什麼是異常?總結為一句話就是:程序在執行過程中產生的異常情況。當某些事情出現了錯誤異常就會發生,比如打開一個並不存在的文件、嘗試在一個為null的對象上調用方法等等,都會發生異常。異常是不可預知的,可是一旦它發生了就需要進行異常處理,可謂知錯就改善莫大焉!異常處理是一種錯誤處理機制,如果你不對異常做任何處理,異常將會導致應用程式崩潰。
  • Java中最正確的異常處理方式
    比如說,你的代碼少了一個分號,那麼運行出來結果是提示是錯誤 java.lang.Error ;如果你用 System.out.println(11/0) ,那麼你是因為你用0做了除數,會拋出 java.lang.ArithmeticException 的異常。
  • Java異常之異常處理機制
    異常處理機制 拉勾IT課小編為大家分解 1、拋出異常2、捕獲異常3、異常處理五個關鍵字:try、catch、finally、throw、throws注意:假設要捕獲多個異常:需要按照層級關係(異常體系結構) 從小到大!
  • 跟我學java編程—Java顯示異常信息與異常分類
    具體如下:● java.lang.ClassCastException:錯誤的類型轉換異常。● java.lang.ArrayIndexOutOfBoundsException:組下標越界異常。● java.lang.NullPointException:空指針訪問異常。
  • java中的異常和日誌
    java的異常處理機制 2.使用try catch finally 處理異常 3.使用throw throws引發異常處理 4.自定義異常 異常 Object ThrowableError Exception SQLException
  • Reactor詳解之:異常處理
    簡介不管是在響應式編程還是普通的程序設計中,異常處理都是一個非常重要的方面。今天將會給大家介紹Reactor中異常的處理流程。/ 2 = 50reactor.core.Exceptions$ErrorCallbackNotImplemented: java.lang.ArithmeticException: / by zero那怎麼處理這個異常呢?
  • Java 統一異常處理 (配置文件集中化定義)
    本文不是講解如何正確使用try、catch、finally等進行異常捕獲,而是就異常碼、異常信息進行封裝,通過配置文件進行集中化定義,來統一異常處理,讓異常處理變得更標準化、統一化,方便維護、管理。1、異常處理 異常處理,又稱為錯誤處理,提供了處理程序運行時出現的任何意外或異常情況的方法。
  • 帶你了解Java中的異常處理機制
    異常處理1.異常處理最根本的優勢就是將檢測錯誤(由被調用的方法完成)從處理錯誤(由調用方法完成)中分離出來。2. 異常類型異常:在Java語言中,將程序執行中發生的不正常情況稱為「異常」。一般是指編程時的邏輯錯誤,是程式設計師應該積極避免其出現的異常。java.lang.RuntimeException類及它的子類都是運行時異常。對於這類異常,可以不作處理,直接找到出現問題的代碼,進行規避。因為這類異常很普遍,若全處理可能會對程序的可讀性和運行效率產生影響。
  • 為什麼不推薦使用try-catch-finally處理Java異常?
    「    本文的所有例子均在本地代碼運行完畢       基於JDK版本1.8,運行環境eclipse       本文類名:TryWithResources,下文的堆棧信息也以此為基礎    」在java開發中,一些網絡連結或者是文件資源都需要程式設計師去手動調用close方法關閉,比如InputStream、OutputStream和java.sql.Connection
  • java安全編碼指南之:異常簡介
    異常是java程式設計師無法避免的一個話題,我們會有JVM自己的異常也有應用程式的異常,對於不同的異常,我們的處理原則是不是一樣的呢?一起來看看吧。下面我們看看這個圖上的常見異常類型:>所有的異常都來自於Throwable。
  • 開發者資料 | Reactor詳解之:異常處理
    今天將會給大家介紹Reactor中異常的處理流程。簡介不管是在響應式編程還是普通的程序設計中,異常處理都是一個非常重要的方面。今天將會給大家介紹Reactor中異常的處理流程。: java.lang.ArithmeticException: / by zero那怎麼處理這個異常呢?
  • 學校裡學不到的C語言教程之3:學習異常處理然後忘掉它
    我個人覺得,除非您所在的公司很有錢,要不這一定是個坑,幾年內是出不來的,工作之餘多存點錢以便被炒的時候 ... 真的,一個剛工作的初學者能維護好一個 C/C++ 伺服器程序的可能性無限接近於0!但在我接觸過使用 delphi 的公司中,居然有很多伺服器是初學者寫的,雖然其中有不少錯誤,但是他們寫的程序是不會動不動就崩潰的。同樣的道理也適用於 java 和 C#。