2014-10-27 89 views
1

這是對我來說沒有意義的東西。Java拋出錯誤和捕獲NullPointerException

第一個例子:

實施例1(GOOD):

public static void main(String args[]){ 
     try { 
      Exception e = null; 
      throw e; 
     } catch (Exception e) { 
     } 

一切都很好與部份代碼 - 拋出異常,並且捕獲。

實施例2(BAD):

public static void main(String args[]){ 
    try { 
     Exception e = null; 
     throw e; 
    } catch (NullPointerException e) { 
    } 
} 

這不會編譯,因爲catch塊不能趕上NullPointerException這是Exception子類。它不知道會拋出什麼樣的異常。

java.lang.Object 
    java.lang.Throwable 
     java.lang.Exception --> Thrown 
      java.lang.RuntimeException 
       java.lang.NullPointerException --> Cannot catch like this 

因此,讓我們改變例外NullPointerException

例3(GOOD)

public static void main(String args[]) { 
    try { 
     NullPointerException e = null; 
     throw e; 
    } catch (NullPointerException e) { 
    } 

簡單而合乎邏輯的,但在這裏談到的東西很奇怪:

例4(GOOD) - 不知道爲什麼?:

public static void main(String args[]) { 
    try { 
     Error e = null; 
     throw e; 
    } catch (NullPointerException e) { 
    } 

如果我扔Error,我怎麼能抓到NullPointerException?這個不成立。

有:

的Throwable:錯誤,異常

兩個ErrorExceptionThrowable子類,但NullPoinTerException無關,與Error,這是一個Exception,不Error

+2

這些例子都不是很好。你從哪裏弄到的? – duffymo 2014-10-27 09:26:28

+0

你確定'catch(NullPointerException e)'*捕獲了'錯誤'嗎? – 2014-10-27 09:26:50

+0

是的,這是我的問題的整個觀點:) – RichardK 2014-10-27 09:27:48

回答

8

您正試圖拋出一個空對象,該對象失敗,並導致拋出NullPointerException

您應該拋出一個異常與throw new Exception();

只是爲了澄清。如果你問爲什麼你的第二個例子沒有編譯,而第四個例子是這樣的:

錯誤和它的子類是未經檢查的例外,它不必在throws子句中被捕獲或聲明。

未檢查異常類是運行時異常類和錯誤類

JLS 11.1.1.

這就是爲什麼你可以拋出一個Error,趕上一個Exception,並且代碼進行編譯。

另一方面,在第二個示例中,您試圖拋出檢查異常(Exception)並捕獲NullPointerException,它不是超級類別Exception。這就是爲什麼代碼不會編譯,除非你捕獲Exception或聲明你的主要方法throws Exception

+1

是的,我知道,但請檢查最後一個例子。 – RichardK 2014-10-27 09:28:44

+0

問題是*'throw'命令本身*拋出異常,因爲你試圖拋出null。 – chrylis 2014-10-27 09:29:31

+1

所以沒關係,我拋出錯誤而不是異常,拋出異常? – RichardK 2014-10-27 09:30:55

1

有兩點需要注意。

首先,因拋擲null對象而拋出NullPointerException對象。這與您試圖拋出的異常的聲明類型無關。

其次,由於Error子類是unchecked異常,編譯器不抱怨說Error catch塊丟失。你的第二個例子沒有編譯,因爲Exception的所有子類都不是未檢查的異常。因此,當編譯器遇到throw e聲明,其中e的聲明類型爲Exception時,它需要一個catch塊以用於Exception

相關問題