2012-08-13 124 views
0

是否有可能拋出一個異常來拋出一個不同的異常呢?Java:可以拋出異常拋出異常嗎?

爲了拋出異常,必須(可選)分配新對象,並調用其構造函數(隱式調用fillinstacktrace)。在某些情況下,它聽起來像addSupressed也被稱爲。那麼如果沒有足夠的內存會發生什麼? JVM是否可以預先分配內建異常?例如,will(1/0)是否拋出OutOfMemoryError而不是ArithmeticException?

此外,構造函數是一個方法調用,因此可以自由地拋出其他異常。在這種情況下會發生什麼?內建的例外會拋出嗎?即使你沒有明確拋出,看起來可能會得到一個StackOverflowError。

回答

5
public class MyStupidException extends Exception { 
    public MyStupidException() { 
    throw new RuntimeException("whoooo"); 
    } 
} 
public static void main(String... args) throws Exception { 
    throw new MyStupidException(); 
} 

打印:螺紋

異常 「主」 了java.lang.RuntimeException:whoooo

所以,是:-)

在這種情況下建於例外情況,有很多事情可能會出錯。我不相信該規範要求JVM保證異常分配成功,所以OutOfMemoryError聽起來像是一個明顯的可能性。還有一些比較模糊的問題,比如類加載失敗,可能會發生。我們也可以進入徹底的奧義,在那裏修改java.lang.Exception以引發異常或錯誤。

所以,我的意見是,你應該期望/計劃在特殊情況下異常處理本身可能導致異常。

+0

雖然完全正確的,我不認爲這是他在問什麼相當。 – Charles 2012-08-13 18:23:44

+0

內建異常情況如何? – Antimony 2012-08-13 18:25:10

+0

@Charles:問題是「是否有可能拋出異常來拋出不同的異常?」,所以它正在回答所述的問題。如果意圖不同,那麼我們應該更新問題:-) – 2012-08-13 18:38:01

4

如果沒有足夠的空間來創建ArthimeticException對象,它將通過OutofMemoryError,因爲除退出進程外,JVM無法繼續。

1

你可以得到

Error err = null; 
throw err; // triggers a NPE. 

// use up almost all the memory 
throw new RuntimeException(); // throws OutOfMemoryError instead. 
+0

是的,但拋出null是記錄的行爲,而不是異常處理的副作用。 – Antimony 2012-08-13 19:04:39

+0

副作用也記錄在案。你在尋找任何無證的「功能」?你有沒有遇到問題,在哪裏看到意外的行爲? – 2012-08-13 19:08:03

+0

「此規範無法預測可能遇到內部錯誤或資源限制的位置,因此可能無法準確報告它們的時間。因此,下面定義的任何VirtualMethodError子類可能會在Java操作過程中的任何 時間虛擬機:「 - 嗯,我想這回答了內置例外的問題。奇怪的是,它沒有提到有關fillinstack trace的任何信息。我想這是一個疏忽。 – Antimony 2012-08-13 19:56:51