java中的異常機制

異常與錯誤的區別

Exception:

1.可以是可被控制(checked) 或不可控制的(unchecked)。
2.表示一個由程序員導致的錯誤。
3.應該在應用程序級被處理。
Error:
1.總是不可控制的(unchecked)。
2.經常用來用於表示系統錯誤或低層資源的錯誤如JVM。
3.如何可能的話,應該在系統級被捕捉。


Exception分類圖




五個關鍵字

throw throws     //用於拋出異常

try catch finally//用於捕獲處理異常
  
  throw用於直接拋出定義的異常類 eg:throw new myException()
  throws用於聲明一個函數可以拋出異常,多個異常用逗號隔開 eg:function() throws Ex1[,Ex2]{}
  
  try{可能發生異常的代碼}
  catch(Ex e){處理異常的代碼}
  catch(Ex e){}
  .......
  finally{爲異常處理提供統一的出口,且finally後面的代碼不會再執行了,不管異常是否發生,都必須執行的代碼,如關閉打開的文件,刪除臨時文件}


           注意:

1.覆蓋父類某方法的子類方法不能拋出比父類方法更多的異常,所以,有時設計父類的方法時會聲明拋出異常,但實際的實現方法的代碼卻並不拋出異常,這樣做的目 的就是爲了方便子類方法覆蓋父類方法時可以拋出異常。
2.try塊中發生異常之後的代碼句不會再執行,如果異常被捕獲處理,則try catch 語句塊執行完之後的語句還可以再執行,因爲這裏的try catch語句塊相當於一個正常的 程序一部分了
         try{

            try{

               try{

               }catch
            }catch

         }catch嵌套結構,被內層捕獲的Exception不會再被外層再捕獲。

/*******

Exception:
	1.可以是可被控制(checked) 或不可控制的(unchecked)。
	2.表示一個由程序員導致的錯誤。
	3.應該在應用程序級被處理。

Error:
	1.總是不可控制的(unchecked)。
	2.經常用來用於表示系統錯誤或低層資源的錯誤如JVM。
	3.如何可能的話,應該在系統級被捕捉。

Exception分類圖
	
五個關鍵字 	throw throws     //用於拋出異常
			try catch finally//用於捕獲處理異常
		   
		   throw用於直接拋出定義的異常類 eg:throw new myException()
		   throws用於聲明一個函數可以拋出異常,多個異常用逗號隔開 eg:function() throws Ex1[,Ex2]{}
		   
		   try{可能發生異常的代碼}
		   catch(Ex e){處理異常的代碼}
		   catch(Ex e){}
		   .......
		   finally{爲異常處理提供統一的出口,且finally後面的代碼不會再執行了,不管異常是否發生,都必須執行的代碼,如關閉打開的文件,刪除臨時文件}
		   
		   注意:
				1.覆蓋父類某方法的子類方法不能拋出比父類方法更多的異常,所以,有時設計父類的方法時會聲明
				拋出異常,但實際的實現方法的代碼卻並不拋出異常,這樣做的目的就是爲了方便子類方法覆蓋父類
				方法時可以拋出異常。
				2.try塊中發生異常之後的代碼句不會再執行,如果異常被捕獲處理,則try catch 語句塊執行完之後
				的語句還可以再執行,因爲這裏的try catch語句塊相當於一個正常的程序一部分了,
			try{
				try{
					try{
					
					}catch
				}catch
			}catch嵌套結構,被內層捕獲的Exception不會再被外層再捕獲。
*******/
import java.io.*;
public class TestEx {
	public static void main(String args[]){
	/*
	int[] array = {1,2,3};
	System.out.println(array[4]);//可以不捕獲的RuntimeException,ArrayIndexOutofBoundsException,有JVM捕獲
	*/
	
	/*
	try{
		System.out.println(2/0);//ArithmeticException,由程序員捕獲處理
	}catch(ArithmeticException e){
		System.out.println("系統出錯");
		e.printStackTrace();
	}
	*/
	
	/*
	try{
		TestEx te = new TestEx();
		te.m(0);
	}catch(ArithmeticException e){
		System.out.println("系統出錯");
		e.printStackTrace();
	}

	System.out.println("我是try catch 語句塊之後的語句,我可以被執行");
	*/
	
	/*
	FileInputStream in = null;
	try{
		//in = new FileInputStream("myFile.txt");//必須有程序員捕獲處理FileNotFoundException
		int b;
		b = in.read();//必須有程序員捕獲處理IOException
		while(b!=1){
			System.out.println((char)b);
			b = in.read();
		}
	}catch (FileNotFoundException e){
		e.printStackTrace();//子類異常捕獲之後,父類異常便不再捕獲這個子類異常了
	}catch (IOException e){
		System.out.println(e.getMessage());
	}finally{
		try{
			in.close();//因爲in是空指針,所以發生空指針異常
		}catch (IOException e){
			e.printStackTrace();
		}catch (NullPointerException e){
			//e.printStackTrace();
			System.out.println("我在finally語句塊中又捕獲了NullPointerException");
		}
		System.out.println("我是finally最後一句代碼");
	}
	*/
	
	try{
		TestEx te = new TestEx();
		te.m(1);
	}catch(ArithmeticException e){
		System.out.println("系統出錯");
		e.printStackTrace();
	}finally{
		System.out.println("finally");
	}
	System.out.println("我是try catch finally語句塊之後的語句,我還會再被執行");
	/*
		TestEx te = new TestEx();
		te.m(0);
	*/

	
	try{
		try{
			try{
				System.out.println(2/0);
			}catch(Exception e){
				System.out.println("我是最內層0 try塊捕獲的Exception");
			}
		}catch(Exception e){
			System.out.println("我是最中層1 try塊捕獲的Exception");
		}
	}catch(Exception e){
		System.out.println("我是最外層2 try塊捕獲的Exception");
	}
	
	}
	public void m(int i)throws ArithmeticException{
		if(i==0){
			throw new ArithmeticException("被除數爲0");
		}
	}
	
	public void f() throws FileNotFoundException,IOException{
		FileInputStream in = new FileInputStream("myFile.txt");
		int b;
		b = in.read();
		while(b!=1){
			System.out.println((char)b);
			b = in.read();
		}
	}
}


發佈了39 篇原創文章 · 獲贊 10 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章