部分內容總結靈感來自馬士兵教育,部分來自百度。
概述
什麼是異常?
異常是程序運行啓動過程中發生的意外事件,它會中斷正在運行的程序。
爲什麼會產生異常?異常有什麼用?
例如生活中:
什麼是異常處理?如下圖所示
Java異常處理
異常是程序中的一些錯誤,但並不是所有的錯誤都是異常,並且錯誤有時候是可以避免的。
異常類的層次
Java中所有的異常類都是 java.lang.Exception 類的子類。
而Exception 類又是Throwable 類的子類。Throwable有兩個子類,分別是Exception與Error。
Exception有兩個比較重要的子類:IOException 類和 RuntimeException 類
捕獲異常try{}catch{}
沒進行異常捕獲之前,這段代碼可能會發生的以下異常並且發生異常代碼行後的代碼見不會被執行
package com.javase;
public class TestString {
public static void main(String[] args) throws Exception {
int a = 100;
int b = 100 / 0;//可能會發生異常的代碼行,這裏沒進行try{}catch{}異常捕獲
System.out.println(b);
System.out.println("這是測試代碼");//這行代碼不會被執行
}
}
try{}catch{}finally{}異常處理後的代碼
package com.javase;
public class TestString {
public static void main(String[] args) throws Exception {
try {
int a = 100;
int b = 100 / 0;//可能會發生異常的代碼行,這裏進行try{}catch{}異常捕獲
System.out.println(b);
System.out.println("這是測試代碼");
} catch (ArithmeticException e) {//還可以多重捕獲異常,多個catch塊,不過異常類級別最低的放在第一個catch塊,級別最高的放在最後
System.out.println("發生異常,異常信息:"+e.getMessage());
}finally {
System.out.println("無論有沒有發生異常這個代碼代碼塊都會被執行,在Java中一般用來釋放資源的");
}
}
}
聲明異常Throws和拋出異常 Throw和自定義 異常GenderException("性別發生異常")
package com.javase;
import java.util.Scanner;
public class TestString {
static class GenderException extends Exception {//自定義異常類繼承Exception 並重寫Exception的構造方法,提示自定義異常語
public GenderException() {
System.out.println("性別出現異常");
}
public GenderException(String message) {
System.out.println("輸出異常信息:"+message);
}
}
public static void toGender() throws GenderException {//throws 異常類【GenderException】 聲明異常
System.out.println("請輸入你的性別");
Scanner scanner = new Scanner(System.in);
String gender = scanner.next();
if (gender.equals("男")) {
System.out.println("你的性別爲:" + gender);
} else {
throw new GenderException("性別輸入錯誤,請重新的輸入");//拋出異常【GenderException】
}
}
public static void main(String[] args) {
try {//這裏調用方法,並對拋出的異常進行捕獲
TestString.toGender();
} catch (GenderException e) {
e.printStackTrace();
}finally{
System.out.println("finally塊");
}
}
}
finally關鍵字
finally 關鍵字用來創建在 try 代碼塊後面執行的代碼塊。
無論是否發生異常,finally 代碼塊中的代碼都會被執行。
在 finally 代碼塊中,用來釋放資源關閉流。
try {//這裏調用方法,並對拋出的異常進行捕獲
TestString.toGender();
} catch (GenderException e) {
e.printStackTrace();
}finally{
System.out.println("finally塊");//一般可用於關閉連接釋放資源
}
-
catch多重異常,子異常類放在第一個catch塊裏,子到父,一級一級往下衍生,如果父異常放在第一個catch塊會出現父異常類信息提示,規避子異常的異常提示,對於代碼維護帶來不便。
-
throws聲明異常可以聲明多個,用逗號隔開。一般建議聲明一個範圍比較大的父異常類。
-
try{}catch{}finally 三個代碼塊中單獨聲明的局部變量不可相互使用,作用域問題。
-
少在try...catch...finally塊裏使用return。
-
throw 拋出異常,一般拋出異常和自定義異常/聲明異常三者同時使用。