標題# Java異常簡介------Exception And Err等之處理機制
Java異常的概念:
沒有按照原定的計劃進行,發生了特殊狀況,異常機制提供了程序退出的安全通道,當出現錯誤後,程序執行的流程發生改變,程序的控制權轉移到異常處理器.
異常的分類:
上圖簡單的展示了一下異常的結構圖,但不是所有的異常,具體的可以查看api文檔,還可以自定義異常
Throwable:是Java中所有錯誤或異常的超類,有兩個重要的子類:Error(錯誤)和Exception(異常)
Error(錯誤):表示Java中的錯誤,一般是運行環境(jar包,依賴)等出了問題,是程序無法處理的錯誤,大多數與代碼編寫者的執行操作無關.
Exception(異常):是Throwable的一種形式,它指出了合理的應用程序想要捕獲的條件,是程序本身可以處理的異常.
Exception分爲兩大類:運行時異常和非運行時異常(編譯異常)
1.運行時異常:RuntimeException類及其子類異常,這些異常時不檢查異常,程序可以選擇捕獲,也可以選擇不處理,一般是由程序邏輯錯誤引起的,常見的運行時異常有:
NullPointerException:當應用程序試圖在需要對象的地方使用 null 時,拋出該異常
IndexOutOfBoundsException:下標越界異常,指示某排序索引(例如對數組、字符串或向量的排序)超出範圍時拋出
ClassNotFoundException:類找不到異常
2.非運行時異常(編譯異常):是RuntimeException以外的異常,類型都是Exception類及其子類,對於非運行時異常,Java編輯器強制要求,我們必須對這些異常進行處理,否則程序不能編譯通過,常見的有:
IOException:io異常
SQLException:MySQL數據庫引起的異常
以上異常知識簡單的舉例了幾個,僅供參考,具體情況,請在代碼中具體分析
異常的處理機制
1.使用throw關鍵字拋出異常
throw new 異常信息:(手動製造一個異常)
當需要指定運行異常時,可以在發生異常的時候,使用throw new RuntimeException(msg)
注:msg自定義的異常信息
學到就要用到,來上實例:
public class ThrowException {
public static void main(String[] args) {
Scanner key = new Scanner(System.in);
System.out.println("請輸入年齡");
int age = key.nextInt();
if(age<=0){
throw new RuntimeException("你還沒出生,趕緊回去別捉妖");
}
System.out.println(age);
key.close();
}
}
2.使用throws關鍵字拋出異常
使用throws關鍵字拋出異常:
在方法或類的後面加上throws XXXException(代表對應發生的異常)
throws:拋出得意思,表示將異常拋給上級(調用者)處理
如果是加在main方法得後面,表示交給Java虛擬機去處理異常
public class IODemo01 {
public static void main(String[] args) throws IOException {
File file = new File("D:\\我很帥.txt");
file.createNewFile();
}
}
現在報錯提示我們有異常,要麼拋出,要麼捕獲,我們這裏選擇throws拋出,也就是對應的第一個選項Add throws declaration
3.捕捉處理異常:try…catch代碼塊
表示:當try中的語句發生異常時,會先到第一個catch中來查找是否發生了第一個異常,如果不是第一個就繼續往下找,看是否是異常2,當處理完之後直接結束try…catch語句
格式1爲:
try{
被捕捉的代碼
}catch(異常類型 e){
對異常的處理
}
格式2爲:
try{
語句1;
語句2;
}catch(異常類型1 e){
對異常的處理1
}catch(異常類型2 e){
對異常的處理2
}catch(異常類型3 e){
對異常的處理3
}
注意:當一個異常同時可以被多個catch捕獲時,會採用就近原則,會選擇與這個異常最相近的catch去執行
當多個catch語句中的異常時父子關係時,應將子異常寫在前面。父異常寫在後面
即:範圍小的異常寫在前面,範圍大的異常寫在後面
這裏還拿剛纔的例子來簡單的說明:
public class IODemo01 {
public static void main(String[] args){
File file = new File("D:\\我很帥.txt");
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
}
現在咱們選擇第二個Surround with try/catch
3.1 finally代碼塊
**finally:**無論異常是否發生都會執行的代碼塊(根據需要,不是必須)
來看格式:
try{
語句1;
語句2;
}catch(Exception e){
對異常的處理
}finally{
最後一定會執行的代碼;
比如我們使用完某個資源爲了防止浪費,最後一定要關閉,操作中途可能有異常導致程序中斷,但
是並不影響資源的關閉
}
來看代碼,咱們故意寫一個異常來看效果:
public class ExceptionDemo06 {
public static void main(String[] args) {
try {
System.out.println("打開連接池");
//在數學裏面0不可以做爲被除數的,所以這裏會報異常:java.lang.ArithmeticException
int a = 2/0;
System.out.println("pilipal");
System.out.println("劈里啪啦工作中");
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println("關閉連接池");
}
好了,本期異常就說到這裏了,如果對異常或者其他有不懂的地方,歡迎前來加我微信進行探討
看完別忘記點贊哦