1. 程式人生 > >雪鵬涯-學海無涯---那山那水那人

雪鵬涯-學海無涯---那山那水那人

java基礎很重要,很多時候,如果基礎不牢,請一定要花時間再回去複習複習,因為在實際中,很多人還是基礎有點不牢,當然也包括博主我,感覺基礎不太牢,所以也再花時間再看看,稍稍練習下。

對於java異常這塊知識點,還是非常重要的,在實際開發中,這個是必備的。所以如果懂一點,但不太理解透徹的不妨可以再看看練習下

java異常體系圖

Throwable

      Java中有個java.lang.Throwable類,這個類是Java中所有異常和錯誤的基類。Throwable下有兩個大類那就是異常(Exception)和錯誤(Error)。

現實生活中的很多病況從面向物件的角度考慮也是一類事物,可以定義為類。再通俗的說:如人生病了,如感冒了,你可以簡單的理解為異常。相信即使對非本行業的人也能理解吧。

java中可以通過類對這一類不正常的現象進行描述,並封裝為物件。

  1. java的異常體系包含在java.lang這個包預設不需要匯入。
  2. java異常體系

|——Throwable  (實現類描述java的錯誤和異常)

|——Error (錯誤)一般不通過程式碼去處理。

|——Exceprion (異常)

|——RuntimeException (執行時異常)

|——非執行時異常

異常圖解如下:

Throwable

常用異常方法:

Error類的常見子類:

 Exception類的常見子類:

RuntimeException類的常見的子類:

以上就是一些比較常見的異常。面試的時候,面試官叫你說出幾個異常,希望你能隨口就能說出或者寫出。

    1. Throwable類
  1. toString() 輸出該異常的類名。
  2. getMessage() 輸出異常的資訊,需要通過構造方法傳入異常資訊(例如病態資訊)。
  3. 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行有出現異常。

二:程式中的異常處理

  1. 當除數是非0,除法運算完畢,程式繼續執行。
  2. 當除數是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 除法運算 運算結束

多個異常

  1. 案例print方法,形參中增加陣列。
  2. 在print方法中運算元組會發生新的異常

ArrayIndexOutOfBoundsException,NullPointerException),如何處理?

1,使用將可能發生異常的程式碼放入try語句中,新增多個catch語句即可。

2,可以處理多種異常,但是同時只能處理一種異常。

3,try中除0異常和陣列角標越界同時出現,只會處理一種。

    1. 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)

總結

  1. 程式中有多個語句可能發生異常,可以都放在try語句中。並匹配對個catch語句處理。
  2. 如果異常被catch匹配上,接著執行try{}catch(){} 後的語句。沒有匹配上程式停止。
  3. try中多個異常同時出現,只會處理第一條出現異常的一句,剩餘的異常不再處理。
  4. 使用多型機制處理異常。
        1. 程式中多型語句出現不同異常,出現了多個catch語句。簡化處理(相當於急診)。
        2. 使用多型,使用這些異常的父類進行接收。(父類引用接收子類物件)

多個catch語句之間的執行順序。

        1. 是進行順序執行,從上到下。
        2. 如果多個catch 內的異常有子父類關係。
              1. 子類異常在上,父類在最下。編譯通過執行沒有問題
              2. 父類異常在上,子類在下,編譯不通過。(因為父類可以將子類的異常處理,子類的catch處理不到)。
              3. 多個異常要按照子類和父類順序進行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("函式執行完畢");
	}
}