一文帶你玩轉(zhuǎn)Java異常處理
1.前言
1.異常是程序中的一些錯誤,但并不是所有的錯誤都是異常,并且錯誤有時候是可以避免的
2.比如說,你的代碼少了一個分號,那么運行出來結(jié)果是提示是錯誤 java.lang.Error;
3.如果你用System.out.println(11/0) ,那么你是因為你用0做了除數(shù),會拋出java.lang.ArithmeticException 的異常
4.異常發(fā)生的原因有很多,通常包含以下幾大類:
- 用戶輸入了非法數(shù)據(jù)。
- 要打開的文件不存在
- 網(wǎng)絡(luò)通信時連接中斷,或者JVM內(nèi)存溢出
5.這些異常有的是因為用戶錯誤引起,有的是程序錯誤引起的,還有其它一些是因為物理錯誤引起的
6.要理解Java異常處理是如何工作的,你需要掌握以下三種類型的異常:
- 檢查性異常: 最具代表的檢查性異常是用戶錯誤或問題引起的異常,這是程序員無法預(yù)見的例如要打開一個不存在文件時,一個異常就發(fā)生了,這些異常在編譯時不能被簡單地忽略
- 運行時異常: 運行時異常是可能被程序員避免的異常。與檢查性異常相反,運行時異??梢栽诰幾g時被忽略
- 錯誤: 錯誤不是異常,而是脫離程序員控制的問題。錯誤在代碼中通常被忽略。例如,當(dāng)棧溢出時,一個錯誤就發(fā)生了,它們在編譯也檢查不到的。
2. Exception 類的層次
2.1 Exception 類的層次簡介
所有的異常類是從 java.lang.Exception 類繼承的子類
Exception 類是 Throwable 類的子類。除了Exception類外,Throwable還有一個子類Error
Java 程序通常不捕獲錯誤。錯誤一般發(fā)生在嚴(yán)重故障時,它們在Java程序處理的范疇之外
Error 用來指示運行時環(huán)境發(fā)生的錯誤,例如,JVM 內(nèi)存溢出。一般地,程序不會從錯誤中恢復(fù)
異常類有兩個主要的子類:IOException 類和 RuntimeException 類
3. Java 內(nèi)置異常類
3.1 Java 內(nèi)置異常類簡介
Java 語言定義了一些異常類在 java.lang 標(biāo)準(zhǔn)包中
標(biāo)準(zhǔn)運行時異常類的子類是最常見的異常類
由于 java.lang 包是默認(rèn)加載到所有的 Java 程序的,所以大部分從運行時異常類繼承而來的異常都可以直接使用
Java 根據(jù)各個類庫也定義了一些其他的異常
3.2 非檢查異常類舉例
3.3 檢查性異常類表
4. 異常方法
4.1 Throwable 類的主要方法
5. 捕獲異常
5.1 捕獲異常簡介
- 使用 try 和 catch 關(guān)鍵字可以捕獲異常。try/catch 代碼塊放在異常可能發(fā)生的地方
- Catch 語句包含要捕獲異常類型的聲明。當(dāng)保護代碼塊中發(fā)生一個異常時,try 后面的 catch 塊就會被檢查
- 如果發(fā)生的異常包含在 catch 塊中,異常會被傳遞到該 catch 塊,這和傳遞一個參數(shù)到方法是一樣
- 一個 try 代碼塊后面跟隨多個 catch 代碼塊的情況就叫多重捕獲
- 可以在 try 語句后面添加 任意數(shù)量的 catch 塊
- 如果保護代碼中發(fā)生異常,異常被拋給第一個 catch 塊
- 如果拋出異常的數(shù)據(jù)類型與 ExceptionType1 匹配,它在這里就會被捕獲
- 如果不匹配,它會被傳遞給第二個 catch 塊
- 如此,直到異常被捕獲或者通過所有的 catch 塊
5.2 try/catch語法如下
try { // 程序代碼 }catch(ExceptionName e1) { //Catch 塊 }
5.3 多重捕獲塊語法說明
try{ // 程序代碼 }catch(異常類型1 異常的變量名1){ // 程序代碼 }catch(異常類型2 異常的變量名2){ // 程序代碼 }catch(異常類型3 異常的變量名3){ // 程序代碼 }
6. throws/throw 關(guān)鍵字
6.1 throws/throw 關(guān)鍵字簡介
如果一個方法沒有捕獲到一個檢查性異常,那么該方法必須使用 throws 關(guān)鍵字來聲明。throws 關(guān)鍵字放在方法簽名的尾部
也可以使用 throw 關(guān)鍵字拋出一個異常,無論它是新實例化的還是剛捕獲到的
一個方法可以聲明拋出多個異常,多個 異常之間用逗號隔開
6.2 代碼實例
import java.io.*; public class className { public void deposit(double amount) throws RemoteException { // Method implementation throw new RemoteException(); } //Remainder of class definition }
7. finally關(guān)鍵字
7.1 finally關(guān)鍵字簡介
finally 關(guān)鍵字用來創(chuàng)建在 try代碼塊后面執(zhí)行的代碼塊
無論是否發(fā)生異常,finally 代碼塊中的代碼總會被執(zhí)行
在 finally 代碼塊中,可以運行清理類型等收尾善后性質(zhì)的語句
finally 代碼塊出現(xiàn)在 catch 代碼塊最后
7.2 finall 語法格式
try{ // 程序代碼 }catch(異常類型1 異常的變量名1){ // 程序代碼 }catch(異常類型2 異常的變量名2){ // 程序代碼 }finally{ // 程序代碼 }
7.3 注意事項說明
catch 不能獨立于 try 存在。
在 try/catch 后面添加 finally 塊并非強制性要求的。
try 代碼后不能既沒 catch 塊也沒 finally 塊。
try, catch, finally 塊之間不能添加任何代碼。
7.4 自定義異常類格式
class MyException extends Exception{ }
7.5 代碼實例
以下實例是一個銀行賬戶的模擬,通過銀行卡的號碼完成識別,可以進行存錢和取錢的操作。
// 文件名InsufficientFundsException.java import java.io.*; //自定義異常類,繼承Exception類 public class InsufficientFundsException extends Exception { //此處的amount用來儲存當(dāng)出現(xiàn)異常(取出錢多于余額時)所缺乏的錢 private double amount; public InsufficientFundsException(double amount) { this.amount = amount; } public double getAmount() { return amount; } }
在下面的 CheckingAccount 類中包含一個 withdraw() 方法拋出一個 InsufficientFundsException 異常。
// 文件名稱 CheckingAccount.java import java.io.*; //此類模擬銀行賬戶 public class CheckingAccount { //balance為余額,number為卡號 private double balance; private int number; public CheckingAccount(int number) { this.number = number; } //方法:存錢 public void deposit(double amount) { balance += amount; } //方法:取錢 public void withdraw(double amount) throws InsufficientFundsException { if(amount <= balance) { balance -= amount; } else { double needs = amount - balance; throw new InsufficientFundsException(needs); } } //方法:返回余額 public double getBalance() { return balance; } //方法:返回卡號 public int getNumber() { return number; } }
下面的 BankDemo 程序示范了如何調(diào)用 CheckingAccount 類的 deposit() 和 withdraw() 方法
//文件名稱 BankDemo.java public class BankDemo { public static void main(String [] args) { CheckingAccount c = new CheckingAccount(101); System.out.println("Depositing $500..."); c.deposit(500.00); try { System.out.println("\nWithdrawing $100..."); c.withdraw(100.00); System.out.println("\nWithdrawing $600..."); c.withdraw(600.00); }catch(InsufficientFundsException e) { System.out.println("Sorry, but you are short $" + e.getAmount()); e.printStackTrace(); } } }
8. 通用異常
在Java中定義了兩種類型的異常和錯誤
JVM(Java虛擬機) 異常: 由 JVM 拋出的異?;蝈e誤。例如:NullPointerException 類,ArrayIndexOutOfBoundsException 類,ClassCastException 類
程序級異常: 由程序或者API程序拋出的異常。例如 IllegalArgumentException 類,IllegalStateException 類
以上就是一文帶你玩轉(zhuǎn)Java異常處理的詳細內(nèi)容,更多關(guān)于Java異常處理的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
ZooKeeper入門教程二在單機和集群環(huán)境下的安裝搭建及使用
本文是ZooKeeper入門系列教程,涵蓋ZooKeeper的安裝使及單機集群環(huán)境搭建,通過實例和大量圖表,結(jié)合實戰(zhàn),幫助學(xué)習(xí)者理解和運用,有需要的朋友可以借鑒參考下2022-01-01Spring Cloud 配置中心多環(huán)境配置bootstrap.yml的實現(xiàn)方法
spring cloud用上了配置中心,就一個boostrap.yml,本文就來介紹一下Spring Cloud 配置中心多環(huán)境配置bootstrap.yml的實現(xiàn)方法,感興趣的可以了解一下2024-03-03Java使用cxf發(fā)布及調(diào)用webservice接口的方法詳解
今天小編就為大家分享一篇關(guān)于Java使用CXF發(fā)布及調(diào)用WebService接口的方法,文中通過代碼示例給大家介紹的非常詳細,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2023-08-08Java并發(fā)編程ReentrantReadWriteLock加讀鎖流程
這篇文章主要介紹了Java并發(fā)編程ReentrantReadWriteLock加讀鎖流程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-05-05詳解使用IntelliJ IDEA新建Java Web后端resfulAPI模板
這篇文章主要介紹了詳解使用IntelliJ IDEA新建Java Web后端resfulAPI模板,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-08-08Elasticsearch學(xué)習(xí)之Terms?set?查詢
這篇文章主要為大家介紹了Elasticsearch學(xué)習(xí)Terms?set?查詢示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02