2017-04-01 66 views
1
public class ExceptionDemo { 

    public static void main(String...args) { 
     try { 
      bar(); 
     } catch (NullPointerException e) { 
      e.printStackTrace(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     foo(); 
    } 

    public static void bar() { 

    } 

    public static void foo() throws NullPointerException { 

    } 
} 

請解釋爲什麼此代碼編譯成功,即使我們沒有處理foo()方法異常。例外的方法沒有處理和代碼編譯成功

+1

因爲'拋出NullPointerException'是沒用的。 *一切都會拋出一個NPE。此外,它是一個'RuntimeException',不需要處理。 – Gendarme

回答

0

在Java中,Exception和Error類是從Throwable類繼承的。異常和錯誤類有子類。

如果你的代碼拋出一個異常(RunTimeException除外),你必須捕獲這個異常。但是,如果你的代碼拋出一個RunTimeException或Error,你不必捕獲RunTimeException或Error,但你可以。

Throwable,Exception和Exception子類(RunTimeException除外)被選中Exception,所以你必須捕獲這個異常。

但RunTimeException和Error類未經檢查異常,所以你不必捕捉。你應該嘗試你的代碼不會在運行時拋出未經檢查的異常。

+0

您不必*重寫程序。如果您願意,您可以捕獲運行時異常,但這可能是一個壞主意。 – Gendarme

1

Java中的NullPointerException是RuntimeException,因此編譯器不會強制您使用try-catch塊來適當地處理它。我們不需要使用try catch塊來處理運行時異常,但是如果它是像FileNotFoundException這樣的編譯時異常,那麼您需要添加try catch塊。

2

在Java中,我們有兩個例外,

1) Checked Exception (Compile Time Exception) 
2) Unchecked Exception (Runtime Exception) 

NullPointerException異常是一個運行時異常,意味着它在運行時將得到遏制。

在你這裏例如美孚()方法通過傳播NullPointeException拋出關鍵字來調用方法,以便在編譯的時候它是好的,但如果莫名其妙的NullPointerException將在運行時被拋出你的代碼將打破。

建議:你應該檢查,而不是由拋出傳播它處理它。

瞭解更多詳情,您可以檢查http://technostepup.com/CoreJava/ExceptionHandling/exception-types.php