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語句塊中的剩餘內容就不會再被執行了。如果你想學習Java可以來這個群,首先是五三二,中間是二五九,最後是九五二,裡面有大量的學習資料可以下載。
示例二: 瞭解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 異常(一) 異常概述及其架構Java架構
- 簡單介紹常見的三種架構設計模式及其優缺點!架構設計模式
- Java_異常介紹Java
- Java異常詳細介紹Java
- 軟體架構簡介架構
- Java架構-(一)spring cloud微服務分散式雲架構 - Spring Cloud簡介Java架構SpringCloud微服務分散式
- Android 圖形架構簡介Android架構
- 四種JavaEE架構簡介Java架構
- 從docker介紹及其簡介Docker
- 簡單介紹Python中異常處理用法Python
- Redux技術架構簡介(一)Redux架構
- spring cloud架構整合-springcloud簡介SpringCloud架構GC
- TiDB簡介與整體架構TiDB架構
- Slack系統架構簡介 - jinlow架構
- 【java】異常Java
- java 異常Java
- Java 異常Java
- Java異常Java
- 異常JavaJava
- Java 異常(二) 自定義異常Java
- Java新增構造方法異常異常——Could not autowire. there is more than one bean of '' typeJava構造方法Bean
- WebServiceCXF與Restful架構風格簡介WebREST架構
- 人工智慧中代理架構簡介人工智慧架構
- 資料湖架構及概念簡介架構
- 一. SpringCloud簡介與微服務架構SpringGCCloud微服務架構
- Java生鮮電商平臺-統一異常處理及架構實戰Java架構
- Xposed原理簡介及其精簡化
- jmu-Java-06異常-01-常見異常Java
- Java 異常表與異常處理原理Java
- 【Android系統】Android系統架構簡介Android架構
- 大資料分類和架構簡介大資料架構
- springcloud微服務分散式雲架構簡介SpringGCCloud微服務分散式架構
- 微服務架構的特徵簡要介紹微服務架構特徵
- Scrapy架構及資料流圖簡介架構
- Spring Cloud系列(一):微服務架構簡介SpringCloud微服務架構
- SAP Commerce Cloud 裡的 Solr 架構簡介CloudSolr架構
- 資料庫 Mysql 邏輯架構簡介資料庫MySql架構
- 伺服器架構導致的SEO收錄異常伺服器架構
- 異常處理及其相關知識點