異常
異常是程序中的一些錯誤,但並不是所有的錯誤都是異常,並且錯誤有時候是可以避免的。
比如說,你的代碼少了一個分號,那麼運行出來結果是提示是錯誤 java.lang.Error;如果你用System.out.println(11/0),那麼你是因爲你用0做了除數,會拋出 java.lang.ArithmeticException 的異常。
異常發生的原因有很多,通常包含以下幾大類:
- 用戶輸入了非法數據。
- 要打開的文件不存在。
- 網絡通信時連接中斷,或者JVM內存溢出。
這些異常有的是因爲用戶錯誤引起,有的是程序錯誤引起的,還有其它一些是因爲物理錯誤引起的。-
要理解Java異常處理是如何工作的,你需要掌握以下三種類型的異常:
- 檢查性異常:最具代表的檢查性異常是用戶錯誤或問題引起的異常,這是程序員無法預見的。例如要打開一個不存在文件時,一個異常就發生了,這些異常在編譯時不能被簡單地忽略。
- 運行時異常: 運行時異常是可能被程序員避免的異常。與檢查性異常相反,運行時異常可以在編譯時被忽略。
- 錯誤: 錯誤不是異常,而是脫離程序員控制的問題。錯誤在代碼中通常被忽略。例如,當棧溢出時,一個錯誤就發生了,它們在編譯也檢查不到的。
異常的出現:
public class ExceptionDemo {
public static void main(String[] args) {
method();
}
public static void method(){
int[] arr = {1,2,3};
System.out.println(arr[1]); //正常
System.out.println(arr[3]); //異常
}
}
Throwable
類是Java語言中所有錯誤和異常的Throwable
類。 只有作爲此類(或其一個子類)的實例的對象由Java虛擬機拋出,或者可以由Java throw
語句拋出。 類似地,只有這個類或其子類可以是catch
子句中的參數類型。 對於異常,編譯時檢查的目的Throwable
和任何子類Throwable
,是不是也無論是子類RuntimeException
或Error
被視爲檢查的異常。
一個Error
是的子類Throwable
表示嚴重的問題,合理的應用程序不應該試圖捕獲。 大多數這樣的錯誤是異常情況。 ThreadDeath
錯誤雖然是“正常”的條件,但也是Error
一個子類,因爲大多數應用程序不應該試圖抓住它。
一個方法不需要在其throws
子句中聲明Error的Error
,該子類可能在執行方法期間拋出,但未被捕獲,因爲這些錯誤是不應該發生的異常條件。 也就是說, Error
及其子類被視爲未經檢查的異常,用於編譯時檢查異常。
JVM默認處理方案
如果程序出現了問題,我們沒有做任何處理,最終JVM會做默認的處理
- 把異常的名稱, 異常原因及異常出現的位置等信息輸出在了控制檯
- 程序停止執行
異常處理
如果程序出現了問題,我們需要自己來處理,有兩種方案:
- try ... catch ...
- throws
try...catch格式
執行流程:
- 程序從try裏面的代碼開始執行
- 出現異常,會自動生成個異常類對象,該異常對象將被提交給Java運行時系統
- 當Java運行時系統接收到異常對象時,會到catch中去找匹配的異常類,找到後進行異常的處理執行完畢之後,程序還可以繼續往下執行
例子:
public class ExceptionDemo {
public static void main(String[] args) {
System.out.println("開始");
method();
System.out.println("結束");
}
public static void method(){
try{
int[] arr = {1,2,3};
System.out.println(arr[1]); //正常
System.out.println(arr[3]); //異常
}catch (ArrayIndexOutOfBoundsException e){
System.out.println("你訪問的數組索引不存在");
}
}
}
結果:
e.printStackTrace();可以輸出異常信息
throwable的成員方法
方法名 | 說明 |
public String getMessage() | 返回此throwable的詳細消息字符串 |
public String toString() | 返回此可拋出的簡短描述 |
public String printStackTrace() | 把異常的錯誤信息輸出在控制檯 |
編譯時異常和運行時異常
Java中的異常被分爲兩大類:編譯時異常和運行時異常,也被稱爲受檢異常和非受檢異常
所有的RuntimeException類及其子類的實例被稱爲運行時異常,其他的異常都是編譯時異常
編譯時異常:必須顯示處理,否則程序就會發生錯誤,無法通過編譯
運行時異常:無需顯示處理,也可以和編譯時異常一樣處理
例子:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class ExceptionDemo {
public static void main(String[] args) {
method();
method2();
}
//運行時異常
public static void method(){
try{
int[] arr = {1,2,3};
System.out.println(arr[1]); //正常
System.out.println(arr[3]); //異常
}catch (ArrayIndexOutOfBoundsException e){
e.printStackTrace();
}
}
//編譯時異常
public static void method2() {
try{
String s = "2078-09-15";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date d = sdf.parse(s);
System.out.println(d);
}catch (ParseException e){
e.printStackTrace();
}
}
}
結果:
throws格式
雖然我們通過try..c.c..可以對異常進行處理,但是並不是所有的情況我們都有權限進行異常的處理
也就是說,有些時候可能出現的異常是我們處理不了的,這個時候該怎麼辦呢?
針對這種情況,Java 提供了throws的處理方案
例子:
public class ExceptionDemo {
public static void main(String[] args) {
method();
}
//運行時異常
public static void method() throws ArrayIndexOutOfBoundsException{
int[] arr = {1,2,3};
System.out.println(arr[1]); //正常
System.out.println(arr[3]); //異常
}
}
異常處理快捷鍵:alt + enter
自定義異常
集合
集合類的特點:提供-種存儲空間可變的存儲模型,存儲的數據容量可以隨時發生改變
集合體繫結構
一起學習,一起進步 -.- ,如有錯誤,可以發評論