異常與錯誤的區別
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();
}
}
}