[2014-10-22]JAVA筆記_Exception(異常)

一、 Java中的異常分爲兩大類

          1. Checked exception(非 Runtime exception):

          2. Unchecked exception(Runtime exception):


·Java 中所有的異常類都會直接或間接地繼承自 Exception。

·RuntimeException類也是直接繼承自 Exception類,它叫做運行時異常,Java中所有的運行時異常都會直接或間接地繼承自RuntimeException。

·Java中凡是繼承自 Exception 而不是繼承自 RuntimeException 的類都是非運行時異常。


二、 異常處理的一般結構是:

         try{}catch(Exception e){}finally{}          無論程序是否出現異常,finally塊中的代碼都是會被執行的。

package com.bob.exception;

public class ExceptionTest2 {
	
	public void method() throws Exception{
		System.out.println("hello world.");
		
		throw new Exception();		//拋出異常
	}

	public static void main(String[] args){

		ExceptionTest2 test = new ExceptionTest2();
		
		try{
			test.method();		//捕獲拋出的異常
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			System.out.println("welcome");
		}
		
	}

}
        ·對於非運行時異常(checked exception),必須要對其進行處理,處理方式有兩種:第一種是使用try...catch..finally進行捕獲;第二種是在調用該會產生異常的方法所在的方法聲明 throws Exception(相當於繼續往上拋直到main方法,如果main方法也不處理那麼就由JVM進行處理)。

        ·對於運行時異常(runtime exception),我們可以不對其進行處理,也可以對其進行處理。推薦不對其進行處理。

package com.bob.exception;

public class ExceptionTest3 {
	
	public static void main(String[] args) {
		String str = null;
		
		System.out.println(str.length());
		
	}

}
上面的程序會報NullPointerException異常。

NullPointerException 是空指針異常,出現該異常的原因在於某個引用爲null,但你卻調用了它的某個方法。這時就會出現該異常。

三、 自定義異常
         所謂自定義異常,通常就是定義了一個繼承自Exception類的子類,那麼這個類就是一個自定義異常類。通話情況下,我們都會直接繼承自 Exception 類,一般不會繼承某個運行時的異常類。

package com.bob.exception;

public class MyException extends Exception {

	public MyException(){
		super();
	}
	
	public MyException(String message){
		super(message);
	}
	
}
package com.bob.exception;

public class MyExceptionTest {

	public void method(String str) throws Exception{

		if(null == str){
			throw new MyException("傳入的字符串參數不能爲null");
		}else{
			System.out.println(str);
		}

	}
	
	public static void main(String[] args) {

		MyExceptionTest test = new MyExceptionTest();
		
		try{
			test.method(null);
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			System.out.println("異常處理完畢");
		}
		
		System.out.println("程序執行完畢");
	}

}

·我們可以使用多個 catch 塊來捕獲異常,這時需要將父類型的 catch 塊放到子類型的 catch 塊之後,這樣才能保證後續的 catch 可能被執行,否則子類型的 catch 將永遠無法到達,java 編譯器會報編譯錯誤;如果多個catch塊的異常類是獨立的(MyException, MyException2),那麼誰前誰後都是可以的。

package com.bob.exception;

public class ExceptionTest5 {

	public void method(){
		try{
			
			System.out.println("進入到了try");
			
//			return ;		//會先執行finally然後return
			System.exit(0);		//退出虛擬機。finally不執行
			
		}
		catch(Exception e){
			
			System.out.println("異常發生了");
		}
		finally{
			
			System.out.println("進入到finally塊");
		}
		
		System.out.println("異常處理後續的代碼");
	}
	
	public static void main(String[] args) {

		ExceptionTest5 test = new ExceptionTest5();
		
		test.method();
	}

}
備註:1. 如果 try 塊中存在 return 語句,那麼首先也需要將 finally 塊中的代碼執行完畢,然後方法再返回。

            2. 如果 try 塊中存在 System.exit(0) 語句,那麼就不會執行 finally 塊中的代碼,因爲System.exit(0) 會終止當前運行的 Java 虛擬機,程序會在虛擬機終止前結束執行。









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章