我對Java的例外有基本的疑問如何爲檢查異常傳播try catch塊?
即,所有檢查的異常從Exception
類延伸,並且未檢查的例外從RuntimeException
延伸。但運行時異常也從Exception
延伸。
但是爲什麼要傳播try
... catch
塊已勾選Exceptions
但未處於未經檢查的異常?
我對Java的例外有基本的疑問如何爲檢查異常傳播try catch塊?
即,所有檢查的異常從Exception
類延伸,並且未檢查的例外從RuntimeException
延伸。但運行時異常也從Exception
延伸。
但是爲什麼要傳播try
... catch
塊已勾選Exceptions
但未處於未經檢查的異常?
一般來說,您應該針對您打算處理的每種特定類型的異常添加不同的catch
塊。如果您試圖處理(通過重新拋出)已檢查的異常,那麼您應該知道重新拋出哪種類型的異常 - 只需添加一個catch
塊來重新拋出每個異常類型即可。
我想你是問,「我怎麼能趕上Exception
但不RuntimeException
?
你也許不應該試圖這樣做。你應該捕獲特定類型的異常時可能的。如果你需要處理所有錯誤,那麼你就應該抓住Exception
,並且抓住一切。*
你很少會想這樣做catch (NullPointerException)
,因爲如果你知道你可以有一個null
那麼你應該檢查它。如果你的代碼是導致NullPointerException
或ArrayOutOfBoundsException
那麼你應該修復這些代碼,以便它不再扔掉即
此代碼應該告訴你怎麼做你問什麼:
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
秒。
RuntimeException有一個異常超級Class.But檢查異常可以把嘗試... catch塊。但未經檢查的異常不會爲什麼? – user1357722
你是什麼意思? catch(NullPointerException e)'工作正常。 –
最簡單的方法是這樣的:
try {
//do stuff
} catch(RuntimeException e) {
throw e;
} catch(SpecificCheckedException e) {
//handle
} catch(Exception e) {
//handle
}
並非所有的unchecked異常自RuntimeException擴展。除此之外,我不確定你在問什麼 - 你是否想知道Java編譯器如何強制執行檢查異常被聲明或處理的要求? – Perception
我認爲這是一個非常好的問題,Error和它的子類也沒有選中。我不確定,但我認爲它們在編譯器中被定義爲被選中或未選中。 –
是的。但Iam嘗試與ArrayIndexOutOfBoundsException比較,空指針異常等 – user1357722