Java異常(一) Java異常簡介及其架構

 

概要

本章對Java中的異常進行介紹。內容包括:
Java異常簡介
Java異常框架html

轉載請註明出處:http://www.cnblogs.com/skywang12345/p/3544168.htmljava

 

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語句塊中的剩餘內容就不會再被執行了。spa

 

示例二: 瞭解finally的基本用法線程

在"示例一"的基礎上,咱們添加finally語句。code

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包含兩個子類: ErrorException。它們一般用於指示發生了異常狀況。
  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》中給出的建議是:對於能夠恢復的條件使用被檢查異常,對於程序錯誤使用運行時異常。

相關文章
相關標籤/搜索