Java 異常
異常是程序中的一些錯誤,但並不是所有的錯誤都是異常,並且錯誤有時候是可以避免的。
比如說,你的代碼少了一個分號,那麼運行出來結果是提示是錯誤 java.lang.Error;如果你用System.out.println(11/0),那麼你是因爲你用0做了除數,會拋出 java.lang.ArithmeticException 的異常。
異常發生的原因有很多,通常包含以下幾大類:
- 用戶輸入了非法數據。
- 要打開的文件不存在。
- 網絡通信時連接中斷,或者JVM內存溢出。
這些異常有的是因爲用戶錯誤引起,有的是程序錯誤引起的,還有其它一些是因爲物理錯誤引起的。-
一、異常的類型
- 檢查型異常:用戶錯誤或問題引起的異常,這是程序員無法預見的。例如要打開一個不存在文件時,一個異常就發生了,這些異常在編譯時不能被簡單地忽略
- 運行時異常 :運行時異常是可能被程序員避免的異常。與檢查性異常相反,運行時異常可以在編譯時被忽略
- 錯誤:錯誤不是異常,而是脫離程序員控制的問題。錯誤在代碼中通常被忽略。例如,當棧溢出時,一個錯誤就發生了,它們在編譯也檢查不到的
二、Excepion 類的層次
異常類有兩個主要的子類:IOException 類和 RuntimeException 類。
三、常見的異常類
異常類型 | 說明 |
---|---|
Exception | 異常層次結構的父類 |
ArithmeticException | 算術錯誤情形,如以零作除數 |
ArrayIndexOutOfBoundsException | 數組下標越界 |
NullPointerException | 嘗試訪問 null 對象成員 |
ClassNotFoundException | 不能加載所需的類 |
IllegalArgumentException | 方法接收到非法參數 |
ClassCastException | 對象強制類型轉換出錯 |
NumberFormatException | 數字格式轉換異常,如把"abc"轉換成數字 |
四、捕獲異常
使用 try 和 catch 關鍵字可以捕獲異常,try/catch 代碼塊放在異常可能發生的地方。try/catch代碼塊中的代碼稱爲保護代碼。
代碼格式:
try{
// 程序代碼
}catch(ExceptionName e1){
//Catch 塊
}
五、多重捕獲塊
一個 try 代碼塊後面跟隨多個 catch 代碼塊的情況就叫多重捕獲。
代碼格式:
try{
// 程序代碼
}catch(異常類型1 異常的變量名1){
// 程序代碼
}catch(異常類型2 異常的變量名2){
// 程序代碼
}catch(異常類型2 異常的變量名2){
// 程序代碼
}
六、finaly
finally 關鍵字用來創建在 try 代碼塊後面執行的代碼塊。
無論是否發生異常,finally 代碼塊中的代碼總會被執行。
在 finally 代碼塊中,可以運行清理類型等收尾善後性質的語句。
代碼格式:
try{
// 程序代碼
}catch(異常類型1 異常的變量名1){
// 程序代碼
}catch(異常類型2 異常的變量名2){
// 程序代碼
}finally{
// 程序代碼
}
七、throws/ throw
throw | throws |
---|---|
生成並拋出異常 | 聲明方法內拋出了異常 |
位於方法體內部,可作爲單獨語句使用 | 必須跟在方法參數列表後面,不能單獨使用 |
拋出一個異常對象,且只能是一個 | 聲明拋出異常類型,可以跟多個異常 |
八、聲明自定義異常
在 Java 中你可以自定義異常。編寫自己的異常類時需要記住下面的幾點。
- 所有異常都必須是 Throwable 的子類。
- 如果希望寫一個檢查性異常類,則需要繼承 Exception 類。
- 如果你想寫一個運行時異常類,那麼需要繼承 RuntimeException 類。
代碼格式:
class MyException extends Exception{
}
實例:
public class Age {
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
if(age > 18){
throw new AgeException();
}
this.age = age;
}
public Age(String name) {
this.name = name;
}
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class AgeException extends RuntimeException{
@Override
public String getMessage() {
return "年齡大於18歲了";
}
}
@Test
//自定義異常
public void test() {
Age age = new Age("zzz");
try {
age.setAge(20);
}catch (AgeException ae){
ae.printStackTrace();
System.out.println("-------------");
}
}