2012-05-03 26 views
-1

我對Java的例外有基本的疑問如何爲檢查異常傳播try catch塊?

即,所有檢查的異常從Exception類延伸,並且未檢查的例外從RuntimeException延伸。但運行時異常也從Exception延伸。

但是爲什麼要傳播try ... catch塊已勾選Exceptions但未處於未經檢查的異常?

+1

並非所有的unchecked異常自RuntimeException擴展。除此之外,我不確定你在問什麼 - 你是否想知道Java編譯器如何強制執行檢查異常被聲明或處理的要求? – Perception

+0

我認爲這是一個非常好的問題,Error和它的子類也沒有選中。我不確定,但我認爲它們在編譯器中被定義爲被選中或未選中。 –

+0

是的。但Iam嘗試與ArrayIndexOutOfBoundsException比較,空指針異常等 – user1357722

回答

0

一般來說,您應該針對您打算處理的每種特定類型的異常添加不同的catch塊。如果您試圖處理(通過重新拋出)已檢查的異常,那麼您應該知道重新拋出哪種類型的異常 - 只需添加一個catch塊來重新拋出每個異常類型即可。

0

我想你是問,「我怎麼能趕上Exception但不RuntimeException

你也許不應該試圖這樣做。你應該捕獲特定類型的異常時可能的。如果你需要處理所有錯誤,那麼你就應該抓住Exception,並且抓住一切。*

你很少會想這樣做catch (NullPointerException),因爲如果你知道你可以有一個null那麼你應該檢查它。如果你的代碼是導致NullPointerExceptionArrayOutOfBoundsException那麼你應該修復這些代碼,以便它不再扔掉即

此代碼應該告訴你怎麼做你問什麼:

public static void throwSomething(Exception throwMe) 
{ 
    try { 
     throw throwMe; 
    } 
    catch(Exception ex) { 

     // Check if the object is a RuntimeException 
     if(ex instanceof RuntimeException) { 
      // Throw the same object again. 
      // Cast to RuntimeException so the compiler will not 
      // require "throws Exception" on this method. 
      throw (RuntimeException) ex; 
     } 

     System.out.println("Caught an instance of a " + 
       ex.getClass().toString()); 
    } 
} 

*其實,catch(Throwable)將捕獲的一切,包括Error秒。

+0

RuntimeException有一個異常超級Class.But檢查異常可以把嘗試... catch塊。但未經檢查的異常不會爲什麼? – user1357722

+0

你是什麼意思? catch(NullPointerException e)'工作正常。 –

0

最簡單的方法是這樣的:

try { 
    //do stuff 
} catch(RuntimeException e) { 
    throw e; 
} catch(SpecificCheckedException e) { 
    //handle 
} catch(Exception e) { 
    //handle 
}