首頁  >  文章  >  Java  >  簡單介紹Java的異常和架構

簡單介紹Java的異常和架構

怪我咯
怪我咯原創
2017-06-30 10:58:341405瀏覽

這篇文章主要分享了Java異常簡介和架構,具有一定的參考價值,有興趣的小夥伴們可以參考一下

Java異常簡介

  Java異常是Java所提供的一種辨識及回應錯誤的一致性機制。

  Java異常機制可以使程式中異常處理程式碼和正常業務程式碼分離,保證程式碼更加優雅,並提高程式健壯性。在有效使用異常的情況下,異常能清晰的回答what, where, why這3個問題:異常類型回答了「什麼」被拋出,異常堆疊追蹤回答了「在哪「拋出,異常訊息回答了「為什麼「會拋出。
Java異常機制用到的幾個關鍵字:try、catch、finally、throw、throws
• try        -- 用於監聽。將要被監聽的程式碼(可能拋出例外的程式碼)放在try語句區塊之內,當try語句區塊內發生例外狀況時,例外狀況就被拋出。
• catch   -- 用於捕捉異常。 catch用來捕捉try語句區塊中發生的異常。
• finally  -- finally語句區塊總是會被執行。它主要用於回收在try區塊裡開啟的物力資源(如資料庫連線、網路連線和磁碟檔案)。只有在finally區塊,執行完成之後,才會回來執行try或catch區塊中的return或throw語句,如果finally中使用了return或throw等終止方法的語句,則不會跳回執行,直接停止。
• throw   -- 用來拋出例外。
• throws -- 用在方法簽章中,用來宣告該方法可能拋出的例外。 

以下透過幾個範例對這幾個關鍵字進行簡單了解。

範例一: 了解try和catch基本用法

public class Demo1 {

  public static void main(String[] args) {
    try {
      int i = 10/0;
       System.out.println("i="+i); 
    } catch (ArithmeticException e) {
       System.out.println("Caught Exception"); 
      System.out.println("e.getMessage(): " + e.getMessage()); 
      System.out.println("e.toString(): " + e.toString()); 
      System.out.println("e.printStackTrace():");
      e.printStackTrace(); 
    }
  }
}

執行結果:

Caught Exception
e.getMessage(): / by zero
e.toString(): java.lang.ArithmeticException: / by zero
e.printStackTrace():
java.lang.ArithmeticException: / by zero
    at Demo1.main(Demo1.java:6)

結果說明:在try語句區塊中有除數為0的操作,該運算會拋出java.lang.ArithmeticException異常。透過catch,對該異常進行捕獲。

觀察結果我們發現,並沒有執行System.out.println("i="+i)。這說明try語句區塊發生異常之後,try語句區塊中的剩餘內容就不會再被執行了。 

範例二: 了解finally的基本用法
在"範例一"的基礎上,我們加入finally語句。

public class Demo2 {

  public static void main(String[] args) {
    try {
      int i = 10/0;
       System.out.println("i="+i); 
    } catch (ArithmeticException e) {
       System.out.println("Caught Exception"); 
      System.out.println("e.getMessage(): " + e.getMessage()); 
      System.out.println("e.toString(): " + e.toString()); 
      System.out.println("e.printStackTrace():");
      e.printStackTrace(); 
    } finally {
      System.out.println("run finally");
    }
  }
}

執行結果:

Caught Exception
e.getMessage(): / by zero
e.toString(): java.lang.ArithmeticException: / by zero
e.printStackTrace():
java.lang.ArithmeticException: / by zero
    at Demo2.main(Demo2.java:6)
run finally

##結果說明:最終執行了finally語句區塊。 

範例三: 了解throws和throw的基本用法
throws是用來宣告拋出的例外,而throw是用來拋出例外。

class MyException extends Exception {
  public MyException() {}
  public MyException(String msg) {
    super(msg);
  }
}

public class Demo3 {

  public static void main(String[] args) {
    try {
      test();
    } catch (MyException e) {
      System.out.println("Catch My Exception");
      e.printStackTrace();
    }
  }
  public static void test() throws MyException{
    try {
      int i = 10/0;
       System.out.println("i="+i); 
    } catch (ArithmeticException e) {
      throw new MyException("This is MyException"); 
    }
  }
}

執行結果:

Catch My Exception
MyException: This is MyException
    at Demo3.test(Demo3.java:24)
at Demo3.main(Demo3.java:13)

結果說明:

  MyException是繼承於Exception的子類別。 test()的try語句區塊中產生ArithmeticException異常(除數為0),並在catch中擷取該異常;接著拋出MyException異常。 main()方法對test()中拋出的MyException進行擷取處理。

Java異常框架

Java異常架構圖

1. Throwable

  Throwable是Java 語言中所有錯誤或例外的超類別。
  Throwable包含兩個子類別: Error 和 Exception。它們通常用於指示發生了異常情況。
  Throwable包含了其執行緒建立時執行緒執行堆疊的快照,它提供了printStackTrace()等介面用於取得堆疊追蹤資料等資訊。

2. Exception

#  Exception及其子類別是Throwable 的一種形式,它指出了合理的應用程式想要捕獲的條件。

3. RuntimeException 

#

  RuntimeException是那些可能在 Java 虛擬機器正常運作期間拋出的例外的超類別。
  編譯器不會檢查RuntimeException異常。例如,除數為零時,拋出ArithmeticException異常。 RuntimeException是ArithmeticException的超類別。當程式碼發生除數為零的情況時,倘若既"沒有透過throws聲明拋出ArithmeticException異常",也"沒有通過try...catch...處理該異常",也能通過編譯。這就是我們所說的"編譯器不會檢查RuntimeException異常"!
  如果程式碼會產生RuntimeException異常,則需要透過修改程式碼來避免。例如,若會發生除數為零的情況,則需要透過程式碼避免該情況的發生!

4. Error

#  和Exception一樣,Error也是Throwable的子類別。它用於指示合理的應用程式不應該試圖捕獲的嚴重問題,大多數這樣的錯誤都是異常條件。
  和RuntimeException一樣,編譯器也不會檢查Error。 

Java將可拋出(Throwable)的結構分為三種:被檢查的例外(Checked Exception),運行時異常(RuntimeException)和錯誤(Error)。

(01) 執行時期例外

定義: RuntimeException及其子類別都稱為執行時期例外。
特點: Java編譯器不會檢查它。也就是說,當程式中可能出現這類異常時,倘若既"沒有透過throws聲明拋出它",也"沒有用try-catch語句捕獲它",還是會編譯通過。例如,除數為零時產生的ArithmeticException異常,數組越界時產生的IndexOutOfBoundsException異常,fail-fail機制產生的ConcurrentModificationException異常等,都屬於運行時異常。
  雖然Java編譯器不會檢查執行時期異常,但是我們也可以透過throws進行宣告拋出,也可以透過try-catch對它進行捕獲處理。
  如果產生運行時異常,則需要透過修改程式碼來進行避免。例如,若會發生除數為零的情況,則需要透過程式碼避免該情況的發生!

(02) 被檢查的異常

定義: Exception類別本身,以及Exception的子類別中除了"運行時異常"之外的其它子類別都屬於被檢查異常。
特點: Java編譯器會檢查它。此類異常,要么透過throws進行聲明拋出,要么通過try-catch進行捕獲處理,否則不能通過編譯。例如,CloneNotSupportedException就屬於被檢查異常。當透過clone()接口去克隆一個對象,而該對象對應的類別沒有實作Cloneable接口,就會拋出CloneNotSupportedException異常。
  被檢查異常通常都是可以恢復的。

(03) 錯誤

#定義: Error類別及其子類別。
特點: 和執行時異常一樣,編譯器也不會對錯誤進行檢查。
  當資源不足、約束失敗、或是其它程式無法繼續運作的條件發生時,就產生錯誤。程式本身無法修復這些錯誤的。例如,VirtualMachineError就屬於錯誤。
  依照Java慣例,我們是不應該是實作任何新的Error子類別的!
對於上面的3種結構,我們在拋出異常或錯誤時,到底該哪一種? 《Effective Java》中給出的建議是:對於可以恢復的條件使用被檢查異常,對於程式錯誤使用運行時異常。

以上是簡單介紹Java的異常和架構的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn