文章目錄
-
-
- Java異常
- 1. 異常的分類
- 2.處理異常
-
- 2.1多catch語句捕捉
- 2.2聲明異常
- 3.抛出異常
- 4.自定義異常
- 總結
-
文章末尾附有知識點概括(思維導圖),有一定基礎者可直接浏覽!
Java異常
有的人認為,異常就代表的項目出現了“問題”,是負面的。但真的是這樣麼?下面來看個例子:
int a = null ;
int b = Integer.parseInt(a);
在一個系統中當遇到這種情況時,我們設想一下如果系統不報錯,哪會有什麼後果?此時的b值,應該為多少?
是以異常其實是一種“好事”,如果你合理利用的話。
1. 異常的分類
Java異常千千萬萬,但是可以粗略的分為兩類 Error 和 Exception:
- Error:表示發生嚴重的錯誤,程式無法恢複,系統立即崩潰。如:
- OOM(Out Of Memory Error):記憶體耗盡
- Stack Overflow Error:棧溢出
- Exception:表示程式發生了一些錯誤,但是可以不影響運作,系統不會立即崩潰。如:
- ClassNotFoundException:為找到類異常
- IOException:IO流異常
進階了解(初學者可以跳過,但以後要記得回來看):
Java中的異常也是類,父類 Throwable 派生出 Error 和 Exception,然後 Error 再派生出 OOM、Stack Overflow Error等等;
Exception類也是同理。如下圖

Exception 派生出 兩大類 :
一種是邏輯上錯誤(RuntimeException),如文章開頭講的例子。這種情況應該修改一下代碼,不需要捕獲。
第二種就是很可能會發生的錯誤(checked Exception):例如當你使用IO讀取檔案時,很有可能發生錯誤,是以需要檢查。此時你必須捕獲,或者聲明異常。
2.處理異常
前面說了Exception “可以不影響運作”,如何做到勒?
答案就是捕獲異常。
捕獲異常 :try catch
try{
// 需要捕獲代碼放在其中
} catch(Exception e){ //
e.printStackTrace(); // 列印異常
} finally {
// 無論如何都會執行這段代碼
}
finally 語句可以省略
2.1多catch語句捕捉
如果使用上面這條語句捕獲異常的話,不論發生什麼異常都會被捕獲。
有的同學可能會說,那不是挺好的麼,異常都捕獲了。
我們前面已經講過 RuntimeException是不需要捕捉異常的,但是使用上這種方式則會捕獲Runtime Exception。
是以捕獲時,我們需要精确的異常的子類
當try塊中可能出現多條異常時,此時我們需要多catch語句捕捉異常,若 catch類出先父子類關系
子類catch 應該在 父類 catch 之前
try {
test.send();
} catch (FileNotFoundException e){
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// FileNotFoundException 是 IOException 的子類
2.2聲明異常
當然除了捕獲異常,你還可以在方法上聲明異常。
将捕獲異常的任務遞交至調用方,但最終都要捕獲這個異常
public void send() throws FileNotFoundException {
FileInputStream input = new FileInputStream(new File("c://"));
}
使用聲明異常,當發生異常時還是會使程式跳出運作
public class Test {
public static void main(String[] args) throws FileNotFoundException {
Test test = new Test();
test.send();
}
public void send() throws FileNotFoundException {
FileInputStream input = new FileInputStream(new File("c://"));
}
}
大家覺得這段程式會使程式中斷麼?
3.抛出異常
public class ThrowException {
int[] ints = {1,3,4,5,6};
public void increase(){
try{
int num = check(3); // 将參數改為2試試
ints[num]++;
}catch (RuntimeException e){
e.printStackTrace();
}
System.out.println(Arrays.toString(ints));
}
public int check(int num){
for (int i = 0; i < ints.length ; i++) {
if (num == ints[i]) return i;
}
throw new RuntimeException("not num in ints");
}
public static void main(String[] args) {
ThrowException throwException = new ThrowException();
throwException.increase();
}
}
看上面這個程式的優點:
- 當出現錯誤時 程式能夠看到,你不需要再到處找bug
- 出現異常也不會影響程式的運作
4.自定義異常
使用自定義異常,發生異常時可讀性更高,且适合不同業務場地開發。
自定義常用異常方法:
- 使用 BaseException繼承 合适的Exception,構造方法照抄父類構造方法
public class BaseException extends RuntimeException{
public BaseException() {
super();
}
public BaseException(String message) {
super(message);
}
public BaseException(String message, Throwable cause) {
super(message, cause);
}
public BaseException(Throwable cause) {
super(cause);
}
protected BaseException(String message, Throwable cause,
boolean enableSuppression,
boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}
- 從 BaseException 上派生出 子類異常
public class NumNotInException extends BaseException{
public NumNotInException() {
super();
}
public NumNotInException(String message) {
super(message);
}
public NumNotInException(String message, Throwable cause) {
super(message, cause);
}
public NumNotInException(Throwable cause) {
super(cause);
}
protected NumNotInException(String message, Throwable cause,
boolean enableSuppression,
boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}
然後便可以使用自定義異常了。
throw new NumNotInException(“have Exception”);
總結
直接用一張圖對今天的知識點進行概括
若是覺得作者講的不錯可以點個贊,加個關注
我會持續更新喲!