2011-08-30 68 views
0
public class StackTest { 
    public static void main(String[] args) { 
     show(); 
     System.out.print("welcome back to maain"); 
     display(); 
    } 
    static void show(){ 
     try{ 
      show(); //recursion 
     }catch(StackOverflowError e){ 
      System.out.print("error cought"); 
     } 
    } 
    static void display(){ 
     System.out.print("after stack overflow error"); 
    } 
} 

在這個程序中發生StackOverflowError但得到處理,程序不會異常終止。爲什麼? 你可以在http://ideone.com/vwSav是否可以處理錯誤?

+1

(通過使用Thread.stop()觸發):http://stackoverflow.com/questions/ 2535723/try-catch-on-stack-overflows-in-java – Thilo

回答

5

可以處理Error因爲他們是Throwable就像Exception s。

錯誤旨在指示程序控制之外的問題,如OutOfMemoryErrorStackOverflowError,但您也可以定義自己的錯誤。

也許你正在想,或聽說OutOFMemoryError可以被捕獲,但不能保證你有足夠的空間來執行處理程序,所以一般來說錯誤不是你可以捕捉到的。但就你而言,你逃避了。在捕捉和處理這個錯誤時沒有違反語言規則。

真正的問題是,應該你抓住他們?通常,當發生錯誤而不是異常時,您的應用程序很可能處於不一致的狀態,從而使恢復成爲最佳狀態。所以真的很小心。最好不要忘記它,讓應用程序死掉,因爲在處理程序不能保證是你想運行的東西之後運行的任何東西。

+0

所以你確認'Error'可以被捕獲? –

+0

@穆罕默德費薩爾 - 他就是這麼說的。這就是你的代碼所做的。錯誤可以被捕獲......但這通常是一個糟糕的想法。 (就像在你的腳上放槍一樣,通常是一個糟糕的主意。) –

+0

@Mohammad,的確,可以捕獲錯誤對象。如果您需要確認,請參閱[Java語言規範中有關try語句的部分](http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.20)。它在這個鏈接上說,catch子句使用聲明類型爲「Throwable」或「Throwable」的任何子類的參數。請注意,'Error'是'Throwable'的子類。再次,可能但不建議。 –

2

看到這個爲什麼當你捕捉到異常(或者在這種情況下是錯誤)時你會期望它終止?該catch塊還能做什麼?

你可以捕獲和處理幾乎所有的錯誤條件,但通常你應該只捕獲異常。

+0

我在問這個,因爲我聽說錯誤無法被捕獲/處理 –

+0

對此,請參閱@ Ray的答案。 – Thilo

0

如果您的異常一直傳播到您的主要方法並且您沒有在那裏處理它,它將只會異常終止。通常會發生未經檢查的運行時異常。如果你想終止你的程序並關閉虛擬機,你可以在catch塊中調用System.exit(int errorCode),如果這樣做的話,會有程序員總是抱怨,但這是一種方法。

0

通常你不抓Error,除了LinkageErrors,無級高清發現錯誤,不合適的鏈接錯誤,不兼容的類變化錯誤..

也是一個OutOfMemory錯誤(有時計算器除外)不列入給予控制因爲沒有內存,所以catch塊。

1

您可以捕獲任何Throwable,並由開發人員正確處理。你甚至可以處理的ThreadDeath或其他子類Throwable(這既不是一個錯誤或異常)相關

public class MyThrowable extends Throwable { } // checked "exception" 

try { 
    throw new MyThrowable(); 
} catch (Throwable t) { 
    t.printStackTrace(); 
    Thread.currentThread().stop(t); // rethrow blindly. 
} 
+0

有沒有既不是錯誤也不是異常的Throwables的例子? – Thilo

+0

我已經添加了一個例子。恕我直言,它不是很好的編程實踐,因爲它的晦澀和大多數人不知道你爲什麼不使用異常或錯誤。 ;) –

+1

我在想「野外的例子」。可能不會,因爲它會被折磨。 – Thilo