JAVA_SE基礎——54.異常

異常的體系:
----------| Throwable  因此異常或者錯誤類的超類
--------------|Error  錯誤   錯誤通常是用於jvm或者是硬件引起的問題,因此咱們通常不會經過代碼去處理錯誤的。
--------------|Exception 異常   是須要經過代碼去處理的。


如何區分錯誤與異常呢:
若是程序出現了不正常的信息,若是不正常的信息的類名是以Error結尾的,那麼確定是一個錯誤。

若是是以Exception結尾的,那麼確定就是一個異常。html


異常的處理:


方式一:捕獲處理(往下面還有方式二


 捕獲處理的格式:

try{
可能發生異常的代碼;


}catch(捕獲的異常類型 變量名){
處理異常的代碼....
}

java


捕獲處理要注意的細節:
1.
code1中體現若是try塊中代碼出了異常通過了處理以後,那麼try-catch塊外面的代碼能夠正常執行。
2.code2中體現若是try塊中出了異常的代碼,那麼在try塊中出現異常代碼後面的代碼是不會執行了。
3.code3中體現一個try塊後面是能夠跟有多個catch塊的,也就是一個try塊能夠捕獲多種異常的類型。
4.code4中體現一個try塊能夠捕獲多種異常的類型,可是捕獲的異常類型必須從小到大進行捕獲,不然編譯報錯。
jvm



code1spa

package day10;


public class TestException2 {
	
	public static void main(String[] args){
		test(1,0);
	}
	public static void test(int a , int b){
		try{
			int c = a/b;
		}catch (ArithmeticException e){
			System.out.println("異常處理了  並返回當前異常對象的完整類名+病態信息 :"+e.toString());
		}
		System.out.println("try-catch塊外面的代碼能夠正常執行中");
	}
}
運行結果:

異常處理了 回當前異常對象的完整類名+病態信息 :java.lang.ArithmeticException: / by zero
try-catch塊外面的代碼能夠正常執行中


指針

code2code

package day10;


public class TestException2 {
	
	public static void main(String[] args){
		test(1,0);
	}
	public static void test(int a , int b){
		try{
			int c = a/b;
			System.out.println("看看是否被執行到~");
		}catch (ArithmeticException e){
			System.out.println("異常處理了  並返回當前異常對象的完整類名+病態信息 :"+e.toString());
		}
	}
}
運行結果:

異常處理了  並返回回當前異常對象的完整類名+病態信息 :java.lang.ArithmeticException: / by zero

htm

」看看是否被執行到~「  這句沒有被執行到,由於int c = a/b;這句出現異常了,因此try塊內的其他代碼都不會執行,直接會被catch 處理掉。對象



code3it

public class TestException2 {
	
	
	public static void main(String[] args){
		int[] arr = null;
		test(10,2,arr);
		
	}
	public static void test(int a , int b, int[] arr)  {
		int c = 0 ;
		try{
			
			c = a/b;
			System.out.println(arr.length);
		}catch (ArithmeticException e){
			System.out.println("異常處理了  並返回回當前異常對象的完整類名+病態信息 :"+e.toString());
		}catch (NullPointerException e){
			System.out.println("出現了空指針異常....");
		}catch (Exception e){
			System.out.println("cc");
		}
		System.out.println("c="+c);
	}
}

運行結果:io

出現了空指針異常....
c=5


code3這段代碼要注意,try塊能檢測多種異常,可是隻能處理一種異常,就是第一個異常。


code4

public class TestException2 {
	
	
	public static void main(String[] args){
		int[] arr = null;
		test(10,2,arr);
		
	}
	public static void test(int a , int b, int[] arr)  {
		int c = 0 ;
		try{
			
			c = a/b;
			System.out.println(arr.length);
		}catch (Exception e){
			System.out.println("Exception類來捕獲的話,其餘類就捕獲不了,至關於父類把工做都作完了,還有子類的事嗎?");
		}catch (NullPointerException e){
			System.out.println("出現了空指針異常....");
		}catch (ArithmeticException e){
			System.out.println("cc");
		}
		System.out.println("c="+c);
	}
}

運行結果:


Exception  把   NullPointerException  和  ArithmeticException    的異常都捕獲處理了,因此會提示錯誤,必須從小到大進行捕獲,不然編譯報錯



方式二:異常的處理方式----拋出處理



拋出處理要注意的細節:
1.code5中體現 若是一個方法的內部拋出了一個異常 對象,那麼必需要在方法上聲明拋出。
2.code6中體現若是調用了一個聲明拋出異常 的方法,那麼調用者必需要處理異常。
3.code7中體現若是一個方法內部拋出了一個異常對象,那麼throw語句後面的代碼都不會再執行了(一個方法遇到了throw關鍵字,該方法也會立刻中止執行的)。
4.code8中體現在一種狀況下,只能拋出一種類型異常對象。(意思就是if())


throw 與throws兩個關鍵字:
1. throw關鍵字是用於方法內部的,throws是用於方法聲聲明上的。
2. throw關鍵字是用於方法內部拋出一個異常對象的,throws關鍵字是用於在方法聲明上聲明拋出異常類型的。
3. throw關鍵字後面只能有一個異常對象,throws後面一次能夠聲明拋出多種類型的 異常


概念

※Exception在程序中必須使用try...catch進行處理。

※RuntimeException能夠不使用try...catch進行處理,可是若是有異常產生,則異常將由JVM進行處理(默認往上拋)



code5

public class TestException2 {
	
	
	public static void main(String[] args){
		try{
			int[] arr = null;
			test(10,2,arr);
		}catch(NullPointerException e){
			System.out.println("報告!  有異常出現");
			e.printStackTrace();
		}
		
	}
	public static void test(int a , int b, int[] arr) throws ArithmeticException,NullPointerException{
		int c = 0 ;
		if(b==0){
			throw new ArithmeticException(); //拋出一個異常對象...
		}else if(arr==null){
			throw new NullPointerException();
		}
			
		c = a/b;
		System.out.println(arr.length);
		
		System.out.println("c="+c);
	}
}

運行結果:

報告!  有異常出現
java.lang.NullPointerException
at day10.TestException2.test(TestException2.java:22)
at day10.TestException2.main(TestException2.java:10)


code6

public class TestException2 {
	
	
	public static void main(String[] args) 
	{
		//try{
			int[] arr = null;
			test(4,0,arr); //調用了一個 聲明拋出異常類型 的方法
		//}catch(Exception e){
			System.out.println("報告! 異常出現了");
		//	e.printStackTrace();
		//}
		
	}
	public static void test(int a , int b, int[] arr) throws Exception,NullPointerException{
		int c = 0 ;
		if(b==0){
			throw new Exception(); //拋出一個異常對象...
		}else if(arr==null){
			throw new NullPointerException();
		}
			
		c = a/b;
		System.out.println(arr.length);
		
		System.out.println("c="+c);
	}
}	

運行結果:



P.S.

這code6中的代碼 ,必定要注意 在test方法拋出的若是是RuntimeException類的話 ,就是不捕獲也不會提示報錯的,由於異常分爲檢查性異常和運行時異常 檢查性異常須要捕捉,運行時異常不會強制要求捕捉,也就是說非RuntimeException  包括Eception  都是須要捕獲  



code7

public class TestException2 {
	
	
	public static void main(String[] args) 
	{
		try{
			int[] arr = null;
			test(4,0,arr); //調用了一個 聲明拋出異常類型 的方法
		}catch(Exception e){
			System.out.println("報告! 異常出現了");
			e.printStackTrace();
		}
		
	}
	public static void test(int a , int b, int[] arr) throws Exception,NullPointerException{
		int c = 0 ;
		if(b==0){
			throw new Exception(); //拋出一個異常對象...
		}else if(arr==null){
			throw new NullPointerException();
		}
			
		c = a/b;
		
		System.out.println(arr.length);
		
		System.out.println("c="+c);
	}
}
運行結果:

報告! 異常出現了
java.lang.Exception
at day10.TestException2.test(TestException2.java:21)
at day10.TestException2.main(TestException2.java:11)


可見C的值沒有打印出來,因此一拋出異常 後面的代碼都不執行了。


code8

class Demo11 
{
	public static void main(String[] args) 
	{
		try{
			int[] arr = null;
			div(10,0,arr); //調用了一個 聲明拋出異常類型 的方法
		}catch(Exception e){
			System.out.println("報告! 出現異常了");
			e.printStackTrace();
		}
		
	}


	public static void div(int a, int b,int[] arr) throws Exception,NullPointerException {
		if(b==0 || arr==null){
			throw new Exception(); //拋出一個異常對象...
			throw new NullPointerException();
		}
		int c = a/b;
		System.out.println("c="+c);
	}
}
運行結果:

由於拋出了異常 就不會處理下面的語句了,方法都結束了 ,因此只能將2個異常分開成兩種狀況 才能避免編譯時錯誤。

if(b==0){
	throw new Exception(); //拋出一個異常對象...
}else if(arr==null){
	throw new NullPointerException();
}


交流企鵝:654249738,和自學者交流羣:517284938

相關文章
相關標籤/搜索