2017-09-23 82 views
-1

在執行catch語句時創建異常對象嗎?拋出異常對象創建

例如,趕上(ArithmeticException someObject)

這是否對象沒有明確地作爲一個實例創建?

+0

它不是在catch子句中創建的。它是由引發它的方法(在你的try-clause中)用'throw'關鍵字創建的。 – Gendarme

+0

它由'throw'語句創建。你只需在catch塊中抓住它。 – vladatr

+0

我的問題是,當創建一個ArithmeticException的實例時,爲什麼我們不必使用關鍵字「new」。在java中是不是這樣,你必須使用關鍵字new的所有情況? – AAM

回答

0

有兩件事創建例外第二的實例拋出異常

創建異常看起來像在這一刻,我們沒」創建類例如NullPointerException npe = new NullPointerException();的任何實例的實例t做任何事情比創造一個實例,有時我們並沒有自己創建異常的例子,我們將會看到

創建Exception類的實例後引發異常我們throw它,你可以拋出自己或JVM異常會做

try 
{ 
    int a = 10/0; 
}catch(ArithmeticException a) 
{ 
    RuntimeException exception = new RuntimeException("a very bad error occured", a); 
    throw exception; 
} 

時的Java試圖計算10/0它遇到算術錯誤,因此JVM創建ArithmeticException類的實例,並拋出此創建的實例你可以捕獲它在你的catch條款,我們創造RuntimeException類的實例,它只是一個對象,然後用它扔throw

0

對於Arithmetic異常,異常對象由JVM 在拋出異常時創建

在內部,它執行相當於創建異常對象的new。什麼情況是這樣的:

  1. 整數除法指令導致硬件陷阱/異常
  2. 操作系統調度此由JVM實現的一個信號處理器
  3. 的JVM標識引起問題線程
  4. 的JVM創建異常,並填充的StackFrame信息
  5. 的JMV拋出異常的違規線程
  6. 的異常傳播
  7. 最終,您的catch子句匹配異常並處理它。

未安裝Java new聲明要做到這一點,需要你源代碼,

類似的事情發生在JVM中拋出異常其他情況;例如典型的NullPointerException,ArrayIndexOutOfBoundsExceptionStackOverflowError例外,雖然在某些情況下,前3或4步被優化......取決於JVM等。


注:一個異常對象是(通常)在其中引發異常,因爲這是當所述堆棧跟蹤信息可要捕獲的點創建。在發現異常的時候,原始的堆棧已經消失了。更有甚者,如果一個異常被捕獲,然後在不同的堆棧上重新生成......或類似的東西。

0

您正在創建一個對象。但是你並沒有創建它的一個實例。

Exception對象實例在有人拋出時創建。

try { 
    Foo foo = null; 
    foo.dofoo(); 
} catch(NullPointerException e) { 
    // ... 
} 

在這種特殊情況下,JVM創建你正在處理的catch塊NullPointerException對象實例。

隻言片語想象的是,在JVM的某些部分有類似:

if (obj == null) { 
    throw new NullPointerException(); 
} 

不要拿上面的代碼示例嚴重。這是異常拋出的例證。