2012-06-08 34 views
0

我想知道是否可以用類似於異常的方式在Java中處理錯誤。我看過無法處理的錯誤,比如AssertionError,我也嘗試在程序中拋出一個錯誤,並嘗試使用catch處理它,它的工作以及下一部分代碼的執行(這與部分的矛盾程序應該在遇到錯誤時退出)。是否像很少的錯誤可以被處理,而其他人不可能被處理?我對此感到困惑,任何人都可以清除我的這個疑問,並說明錯誤和異常之間的區別?錯誤可以以與異常相同的方式處理

package package1; 

public class Class1 
{ 
public static void main(String[] args) 
{ 
    Class1 cl1=new Class1(); 
    int x=2; 
    String s = null; 
    //assert(x<0):"x is not less than zero"; 
    try 
    { 
     cl1.workonExceptions(); 
    } 
    catch (Error e)  
    { 
     e.printStackTrace(); 
    } 
    System.out.println("Not Terminated yet"); 
} 
public void workonExceptions() throws Error 
{            
    try           
    { 
     throw new Exception("Exception"); 
    } 
    catch (Exception e) 
    { 
     throw new Error("Exception Again");   } 
} 
} 
+1

一些[read](http://www.coderanch.com/t/269746/java-programmer-SCJP/certification/Error-vs-Exception) – Attila

+1

AssertionError是一個Throwable錯誤。所以你需要'catch(Error e)';異常也是Throwable,但不是祖先。 –

回答

3

關於​​的一些背景知識:它的目的不是捕獲;它只有當東西變成真的錯誤意思是是一個例外,因爲它有時可能會出現,但不應該中斷或嚴重干擾程序的運行,例如除以零。

至於它在try...catch聲明中工作,原因是這是Throwable類的屬性。

只有此類(或其某個子類)的實例的對象由Java虛擬機引發或可以由Java throw語句拋出。同樣,只有這個類或它的一個子類可以是catch子句中的參數類型。

1

如果從方法拋出異常,編譯器需要通過該方法的調用者來捕獲異常。

即使從方法拋出錯誤,編譯器也不需要該方法調用者捕獲錯誤。

調用者都可以捕獲異常和錯誤,並且它們的行爲方式相同。如果你有代碼說明「繼續執行」,我很樂意看到它。如果你拋出其中的任何一個(都是從Throwable派生的),那麼執行從中拋出它們的方法就會停止(最後缺少子句,這是我不希望在本文中討論的規則的一個例外(ahem)例外)。

1

Java中的所有錯誤都是可捕獲的,包括AssertionError,儘管不建議捕獲它們,但不保證JVM處於足夠一致的狀態以在Error之後繼續執行。所以你看到的是完全正常的。

與C#不同,即使ThreadDeath的處理方式與其他Throwable(即可以捕獲和使用)的處理方式幾乎相同。

錯誤和異常之間的主要區別是方法可以拋出任何錯誤,而不管它們的異常說明符如何。