一文帶你玩轉(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)絡通信時連接中斷,或者JVM內(nèi)存溢出
5.這些異常有的是因為用戶錯誤引起,有的是程序錯誤引起的,還有其它一些是因為物理錯誤引起的
6.要理解Java異常處理是如何工作的,你需要掌握以下三種類型的異常:
- 檢查性異常: 最具代表的檢查性異常是用戶錯誤或問題引起的異常,這是程序員無法預見的例如要打開一個不存在文件時,一個異常就發(fā)生了,這些異常在編譯時不能被簡單地忽略
- 運行時異常: 運行時異常是可能被程序員避免的異常。與檢查性異常相反,運行時異??梢栽诰幾g時被忽略
- 錯誤: 錯誤不是異常,而是脫離程序員控制的問題。錯誤在代碼中通常被忽略。例如,當棧溢出時,一個錯誤就發(fā)生了,它們在編譯也檢查不到的。
2. Exception 類的層次
2.1 Exception 類的層次簡介
所有的異常類是從 java.lang.Exception 類繼承的子類
Exception 類是 Throwable 類的子類。除了Exception類外,Throwable還有一個子類Error
Java 程序通常不捕獲錯誤。錯誤一般發(fā)生在嚴重故障時,它們在Java程序處理的范疇之外
Error 用來指示運行時環(huán)境發(fā)生的錯誤,例如,JVM 內(nèi)存溢出。一般地,程序不會從錯誤中恢復
異常類有兩個主要的子類:IOException 類和 RuntimeException 類
3. Java 內(nèi)置異常類
3.1 Java 內(nèi)置異常類簡介
Java 語言定義了一些異常類在 java.lang 標準包中
標準運行時異常類的子類是最常見的異常類
由于 java.lang 包是默認加載到所有的 Java 程序的,所以大部分從運行時異常類繼承而來的異常都可以直接使用
Java 根據(jù)各個類庫也定義了一些其他的異常
3.2 非檢查異常類舉例

3.3 檢查性異常類表

4. 異常方法
4.1 Throwable 類的主要方法

5. 捕獲異常
5.1 捕獲異常簡介
- 使用 try 和 catch 關(guān)鍵字可以捕獲異常。try/catch 代碼塊放在異常可能發(fā)生的地方
- Catch 語句包含要捕獲異常類型的聲明。當保護代碼塊中發(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用來儲存當出現(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),幫助學習者理解和運用,有需要的朋友可以借鑒參考下2022-01-01
Spring Cloud 配置中心多環(huán)境配置bootstrap.yml的實現(xiàn)方法
spring cloud用上了配置中心,就一個boostrap.yml,本文就來介紹一下Spring Cloud 配置中心多環(huán)境配置bootstrap.yml的實現(xiàn)方法,感興趣的可以了解一下2024-03-03
Java使用cxf發(fā)布及調(diào)用webservice接口的方法詳解
今天小編就為大家分享一篇關(guān)于Java使用CXF發(fā)布及調(diào)用WebService接口的方法,文中通過代碼示例給大家介紹的非常詳細,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2023-08-08
Java并發(fā)編程ReentrantReadWriteLock加讀鎖流程
這篇文章主要介紹了Java并發(fā)編程ReentrantReadWriteLock加讀鎖流程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-05-05
詳解使用IntelliJ IDEA新建Java Web后端resfulAPI模板
這篇文章主要介紹了詳解使用IntelliJ IDEA新建Java Web后端resfulAPI模板,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-08-08

