JAVA_基礎異常概述與異常體系的結構

異常概述與異常體系的結構

Error:java虛擬機沒法解決的嚴重問題。JVM系統內部錯誤、資源耗盡等嚴重狀況。
好比:StackOverflowError,通常不編寫針對性的代碼進行處理。java

Exception:其它因編程錯誤或偶然的外在因素致使的通常性問題,可使用針對性的代碼進行處理。
好比:空指針訪問、試圖讀取不存在的文件、網絡連接中斷、數組角標越界。數據庫

異常體系結構

java.lang.Throwable:
|-------java.lang.Error:通常不編寫針對性的代碼進行處理。編程

  • java.lang.Exception:可進行異常的處理
    • 編譯時異常(checkd
      • IOException
        • FIleNotFoundException:文件找不到異常
      • ClassNotFoundException:類找不到異常
    • 運行時異常(uncheckdRuntimeException
      • NullPointerException:空指針異常
      • ArrarIndexOutOfBoundsException:數組下標越界異常
      • ClassCastException:數據類型轉換異常
      • NumberFormatException:數字格式化異常
      • InputMismatchException:輸入類型與獲取類型不匹配異常
      • ArithmeticException:算術異常
//	************************編譯時異常************************
//	FIleNotFoundException
	@Test
	public void test7() {
		File file = new File("hello.txt");
		FileInputStream fis = new FileInputStream(file);
		
		int data = fis.read();
		while(data != -1) {
			System.out.println((char)data);
			data = fis.read();
		}
		
		fis.close();
	}
	
//	************************運行時異常************************
//	ArithmeticException
	@Test
	public void test6() {
		int a = 5;
		int b = 0;
		System.out.println(a / b);
	}
	
//	InputMismatchException
	@Test
	public void test5() {
		Scanner scanner = new Scanner(System.in);
		int nextInt = scanner.nextInt();
		System.out.println(nextInt);
	}
	
//	NumberFormatException
	@Test
	public void test4() {
		String str = "abc";
		int num = Integer.parseInt(str);
	}
	
//	ClassCastException
	@Test
	public void test3() {
		Object obj = new Date();
		String str = (String)obj;
	}
	
//	IndexOutOfBoundsException
	@Test
	public void test2() {
		//ArrayIndexOutOfBoundsException
		int[] arr = new int[5];
		System.out.println(arr[5]);
		
		//StringIndexOutOfBoundsException
		String str = "abc";
		System.out.println(str.charAt(3));
	}
	

//	NullPointerException
	@Test
	public void test1() {
		String str = "abc";
		str = null;
		System.out.println(str.charAt(0));
	}

異常處理機制一

異常的處理:抓拋模型數組

過程一"拋":程序在正常執行的過程當中,一旦出現異常,就會在異常代碼出生成一個對應異常類的對象。並將此對象拋出,一旦拋出對象,以後的代碼就再也不執行。網絡

關於異常對象的產生
① 系統自動生成的異常對象。
② 手動的生成一個異常對象,並拋出(throw)。指針

過程二"抓":能夠理解爲異常的處理方式(try-catch-finallythrows)。code

try-catch-finally的使用

try{
	//可能出現異常的代碼
	}catch(異常類型1 變量名1){
	//處理異常的方法1
	}catch(異常類型2 變量名2){
	//處理異常的方法2
	}...
	 finally{
	//必定會執行的代碼
	}

1)使用try將可能出現異常的代碼包裝起來,在執行過程當中,一旦出現異常,就會生成一個對應異常類的對象,根據此對象的類型,去catch中匹配。orm

2)一旦try中的異常對象匹配到某一個catch時,就進入catch中進行異常處理。一旦處理完成,就跳出當前的try-catch結構(在沒有finally的狀況),繼續執行其後的代碼。對象

3)catch中的異常類型若是沒有子父關係,則誰聲明在上,誰聲明在下無所謂。catch中的異常類型若是知足子父類關係,則要求類必定聲明在父類的上面,不然,報錯。繼承

4)經常使用的異常處理方式:

  • String getMessage()
  • printStackTrace()

5)在try結構中聲明的變量只能在內部使用,出了try結構之後,就不能在被調用。

體會:使用try-catch-finally處理編譯時異常,只得程序在編譯時就再也不報錯,可是運行> 時仍可能報錯。至關於咱們使用try-catch-finally將一個編譯時可能出現的異常,延遲到> 運行時出現。

體會2:開發中,因爲運行時異常比較常見,因此咱們一般就不針對運行時異常編寫try-catch-finally了。針對一編譯時異常,咱們必定要考慮異常的處理。

finally的使用

1)finally是可選的

2)finally中聲明的是一旦會執行的代碼。即便catch中又出現異常了,try中的return語句、catch中有return語句等狀況。

3)像數據庫連接、輸入輸出流、網絡編程Socket等資源,JVM是不能自動回收的,咱們須要本身手動的進行資源的釋放。此時資源釋放,就須要聲明在finally中。

異常處理的方式二(throws)

"throws + 異常的類型"寫在方法的聲明處。指明此方法執行時,可能會拋出的異常類型。當方法執行時,出現異常,仍會在異常代碼處生成一個異常類的對象,此對象知足throws後異常類型時,就會被拋出。異常的後續代碼將再也不執行。

體會:try-catch-finally:真正的將異常給處理掉了。
throws的方式只是將異常拋給了方法的調用者。並無真正將異常處理掉。

開發中如何選擇使用try-catch-finally仍是使用throws?

1、若是父類中被重寫的方法沒有throws方式處理異常,則子類重寫的方法也不能使用throws,意味着若是子類重寫的方法中有異常,必須使用try-catch-finally方式處理。

2、執行的方法中,前後又調用了另外幾個方法,這幾個方法時遞進關係執行的。建議這幾個方法使用throws的方式進行處理。而執行的方法A能夠考慮使用tyr-catch-finally方式進行處理。

如何自定義異常類

1、繼承於現有的異常結構:運行時異常(RuntimeException)、編譯時異常(Exception

2、提供全局常量:serialVersionUID

3、重載幾個構造器

具體的自定義異常類,以後補上

相關文章
相關標籤/搜索