雪鵬涯-學海無涯---那山那水那人
java基礎很重要,很多時候,如果基礎不牢,請一定要花時間再回去複習複習,因為在實際中,很多人還是基礎有點不牢,當然也包括博主我,感覺基礎不太牢,所以也再花時間再看看,稍稍練習下。
對於java異常這塊知識點,還是非常重要的,在實際開發中,這個是必備的。所以如果懂一點,但不太理解透徹的不妨可以再看看練習下
java異常體系圖
Throwable
Java中有個java.lang.Throwable類,這個類是Java中所有異常和錯誤的基類。Throwable下有兩個大類那就是異常(Exception)和錯誤(Error)。
現實生活中的很多病況從面向物件的角度考慮也是一類事物,可以定義為類。再通俗的說:如人生病了,如感冒了,你可以簡單的理解為異常。相信即使對非本行業的人也能理解吧。
java中可以通過類對這一類不正常的現象進行描述,並封裝為物件。
- java的異常體系包含在java.lang這個包預設不需要匯入。
- java異常體系
|——Throwable (實現類描述java的錯誤和異常)
|——Error (錯誤)一般不通過程式碼去處理。
|——Exceprion (異常)
|——RuntimeException (執行時異常)
|——非執行時異常
異常圖解如下:
常用異常方法:
Error類的常見子類:
Exception類的常見子類:
RuntimeException類的常見的子類:
以上就是一些比較常見的異常。面試的時候,面試官叫你說出幾個異常,希望你能隨口就能說出或者寫出。
-
- Throwable類
- toString() 輸出該異常的類名。
- getMessage() 輸出異常的資訊,需要通過構造方法傳入異常資訊(例如病態資訊)。
- printStackTrace() 列印棧資訊。
通過以上簡單的介紹:那麼接下來的是簡單的程式碼演示。理解與實戰並行,這樣影響才深刻。
一:演示異常在的Throwable基類產生
demo1如下程式碼所示:
package cn.demo; public class DemoThrowable { public static void main(String[] args) { // 定義一個Throwable類 Throwable abc = new Throwable("世界你好"); System.out.println(abc.getMessage()); // 輸出異常的資訊 System.out.println(abc.toString()); // 輸出該異常的類名 abc.printStackTrace(); // 列印棧資訊 } }
輸出結果如下圖:
說明在第6行有出現異常。
二:程式中的異常處理
- 當除數是非0,除法運算完畢,程式繼續執行。
- 當除數是0,程式發生異常,並且除法運算之後的程式碼停止執行。因為程式發生異常需要進行處理。
demo2演示練習一個超簡單的除法運算如下所示:
package cn.demo;
//演示除法的異常產生
public class DemoThrowable2 {
public static void main(String[] args) {
// 呼叫abc這個函式,並賦值x為6,被除數y為0,這樣2除以0肯定是有問題的
abc(6, 0);
System.out.println("over");
}
// 定義一個除法函式abc
public static void abc(int x, int y) {
// 該行程式碼的y值可能是0,程式會出現異常並停止
System.out.println(x / y);//輸出x除以y
System.out.println("除法運算");
}
}
結果如下:
以上就是一個異常,那麼面對異常怎麼辦呢?兩種方法,一種是丟擲異常,一種是處理異常。這兩種的方式都是為了讓程式繼續執行。如果不處理的話,那麼程式是肯定不能走下去。就卡死在這裡了。所以這裡博主演示處理的方式。
package cn.demo;
public class DemoThrowable1 {
public static void main(String[] args) {
// 呼叫abc這個函式,並賦值x為6,被除數y為0,這樣2除以0肯定是有問題的
abc(6, 0);
System.out.println("運算結束");
}
public static void abc(int x, int y) {
try {
//該行程式碼的y值可能是0,程式會出現異常並停止
System.out.println(x/y);
} catch (Exception e) {
//System.out.println(e.toString());// 輸出該異常的類名
//System.out.println(e.getMessage()); // 輸出異常的資訊
//實際開發中,以上兩個不會寫,但這裡是方便大家暫時學習,以後熟悉以上2個異常的類名與異常的資訊是不寫的
e.printStackTrace();// 列印棧資訊
System.out.println("除數不能為0");
}
System.out.println("除法運算");
}
}
運算結果如下:
java.lang.ArithmeticException: / by zero at cn.demo.DemoThrowable1.abc(DemoThrowable1.java:12) at cn.demo.DemoThrowable1.main(DemoThrowable1.java:6) 除數不能為0 除法運算 運算結束
多個異常
- 案例print方法,形參中增加陣列。
- 在print方法中運算元組會發生新的異常
ArrayIndexOutOfBoundsException,NullPointerException),如何處理?
1,使用將可能發生異常的程式碼放入try語句中,新增多個catch語句即可。
2,可以處理多種異常,但是同時只能處理一種異常。
3,try中除0異常和陣列角標越界同時出現,只會處理一種。
-
-
package cn.demo; //多個異常演示 public class DemoThrowable3 { public static void main(String[] args) { System.out.println(); int[] arr = { 1, 2 }; arr = null; // print (1, 0, arr); print (1, 2, arr); System.out.println("over"); } public static void print(int x, int y, int[] arr) { try { System.out.println(arr[1]); System.out.println(x / y); } catch (ArithmeticException e) { e.toString(); e.getMessage(); e.printStackTrace(); System.out.println("算術異常。。。"); } catch (ArrayIndexOutOfBoundsException e) { e.toString(); e.getMessage(); e.printStackTrace(); System.out.println("陣列角標越界。。。"); } catch (NullPointerException e) { e.toString(); e.getMessage(); e.printStackTrace(); System.out.println("空指標異常。。。"); } System.out.println("函式執行完畢"); } }
執行結果 如下: 空指標異常。。。 函式執行完畢 over java.lang.NullPointerException at cn.demo.DemoThrowable3.print(DemoThrowable3.java:19) at cn.demo.DemoThrowable3.main(DemoThrowable3.java:11)
-
總結
- 程式中有多個語句可能發生異常,可以都放在try語句中。並匹配對個catch語句處理。
- 如果異常被catch匹配上,接著執行try{}catch(){} 後的語句。沒有匹配上程式停止。
- try中多個異常同時出現,只會處理第一條出現異常的一句,剩餘的異常不再處理。
- 使用多型機制處理異常。
-
-
- 程式中多型語句出現不同異常,出現了多個catch語句。簡化處理(相當於急診)。
- 使用多型,使用這些異常的父類進行接收。(父類引用接收子類物件)
-
-
多個catch語句之間的執行順序。
-
-
-
- 是進行順序執行,從上到下。
- 如果多個catch 內的異常有子父類關係。
-
-
- 子類異常在上,父類在最下。編譯通過執行沒有問題
- 父類異常在上,子類在下,編譯不通過。(因為父類可以將子類的異常處理,子類的catch處理不到)。
- 多個異常要按照子類和父類順序進行catch
-
-
-
-
package cn.demo;
class Father {
}
class Son extends Father {
}
public class DemoTest {
public static void main(String[] args) {
System.out.println();
int[] arr = { 1, 2 };
arr = null;
Father f = new Father();
div(1, 0, arr, f);
System.out.println("over");
}
public static void div(int x, int y, int[] arr, Father f) {
try {
System.out.println(arr[1]);
System.out.println(x / y);
Son s = (Son) f;
} catch (ArithmeticException e) {
e.toString();
e.getMessage();
e.printStackTrace();
System.out.println("算術異常。。。");
} catch (ArrayIndexOutOfBoundsException e) {
e.toString();
e.getMessage();
e.printStackTrace();
System.out.println("陣列角標越界。。。");
} catch (NullPointerException e) {
e.toString();
e.getMessage();
e.printStackTrace();
System.out.println("空指標異常。。。");
} catch (Exception e) {
e.toString();
e.getMessage();
e.printStackTrace();
System.out.println("出錯啦");
}
System.out.println("函式執行完畢");
}
}