1:請描述Java中異常處理機制的簡單原理和應用,並說明Error與Exception有什麼區別。
每當產生異常後,如果沒有程式進行相應的處理,則程式會中斷的現象,那麼,此時實際上一旦產生一個異常之後,JVM會拋出一個異常類的執行個體化對象,如果此時使用了try語句進行捕獲的話,則可以進行異常處理,如果沒有的話,則交給JVM進行處理,當try語句捕獲到了異常之後,會與catch中的異常類型進行匹配,如果匹配成功,則使用此catch語句進行處理。
應用:簡單的應用,就是在所有throws關鍵字的地方加入try...catch
如果按照一個標準做法的話,try、catch、finally、throw、thorws關鍵字應該一起使用。
JAVA程式違反了JAVA的語義規則時,JAVA虛擬機器就會將發生的錯誤表示為一個異常。違反語義規則包括2種情況。一種是JAVA類庫內建的語義檢查。例如數組下標越界,會引發IndexOutOfBoundsException;訪問null的對象時會引發 NullPointerException。另一種情況就是JAVA允許程式員擴充這種語義檢查,程式員可以建立自己的異常,並自由選擇在何時用 throw關鍵字引發異常。所有的異常都是java.lang.Thowable的子類。
eg:第一種
class Test{
public int devide(int x ,int y) throws Exception{ //
int result = x/y;
return result;
}
}
class TestException{
public static void main(String[] args){
try{
new Test().devide(3,0);
}catch(Exception e){
System.out.println(e.getMessage());//雖然Exception除了Constructor之外沒有其它的函數,
//但它繼承了Throwable類.
}
System.out.println("Program running here");
}
}
當編寫Test class不知道它是否拋出異常時,可以在devide methods方法後添加 throws Exception 就可以..而在TestException中必須處理拋出的異常.
eg:第二種
如果自己定義異常類,必須繼承Exception,也就是它的子類.
class Test{
public int devide(int x ,int y) throws Exception{ //
if(y < 0)
throw DevideMyMinusException("devide is" + y);
int result = x/y;
return result;
}
}
class DevideMyMinusException extends Exception{
public DevideMyMinusException (String msg){
super(msg); //調用父類(Exception)的Construtor,主函數getMessage()輸出自訂的異常:"devide is..."
}
}
eg.第三種
可以拋出多個異常類.
class Test{
public int devide(int x ,int y) throws ArithmeticException,DevideMyMinusException{ //
if(y < 0)
throw new DevideMyMinusException("devide is" + y);
int result = x/y;
return result;
}
}
class DevideMyMinusException extends Exception{
public DevideMyMinusException (String msg){
super(msg);
}
}
class TestException{
public static void main(String[] args){
try{
new Test().devide(3,-1);
}catch(ArithmeticException e){
System.out.println("program running into ArithmeticException ");
e.printStackTrace();
}catch(DevideMyMinusException e){
System.out.println("program running into DevideMyMinusException");
e.printStackTrace();
}catch(Exception e){
System.out.println(e.getMessage)
)finally{
System.out.println("finally running");//不管程式發生異常沒有,finally代碼塊都要執行.
}
System.out.println("Program running here");
}
}
1.程式根據異常類型的匹配.自動進入相應的catch語句.Exception應放在其它異常語句後,因為他們都繼承Exception ,其它異常要放在後面,就沒有什麼意義了.
2.try {}裡有一個return語句,那麼緊跟在這個try後的finally {}裡的code會不會被執行,什麼時候被執行,在return前還是後? 會執行,而且在return 前執行.
3.什麼時候finally裡的代碼不會執行呢? 當出現System.exit(0);時,它不會執行,程式會退出.
Error和Exception的區別:
Java中的Error和Exception都是來之Throwable 這個Class的,是他的SubClass,
Error:是系統中的錯誤,程式員是不能改變,處理的,在程式編譯的時候出現的錯誤.只有通過修改程式才能修正Error.
Exception:是在程式啟動並執行時候捕捉的錯誤,是可以處理的異常.
文法是:try{}
catch(Exception 名字){}
finally
{進行資源的清理工作: 比如關閉開啟的檔案: 刪除臨時的檔案; ....}
Exception:它也分兩種:RuntimeException(是經常出現的錯誤可以不catch)和其他Exception(是必須要catch的,這樣程式才能繼續,像某個方法裡面有throw IoException).