2013-10-17 82 views
0

閱讀有關本book例外,我發現這樣的說法:檢查和未檢查異常在Java中如何工作?

經過異常是由在編譯時,編譯器檢查。

編譯器不檢查在編譯時未檢查異常。

所以,如果我們也可以說,IOExceptionSQLException是檢查異常分類如下。 java編譯器怎麼知道會有一個例外,沒有爲IllegalArgumentException威力保持裏面的代碼是我的理解。

此外,究竟是被強制性取得Checked異常並且不是Unchecked意味着什麼?

+1

忘記所有答案並閱讀[Java語言規範的這一章](http://docs.oracle.com/javase/specs/jls/se7/html/jls-11.html#jls-11.1.1 )。 –

+0

非常有用,謝謝。爲什麼我應該忘記答案?你真的認真嗎? – diegoaguilar

+1

答案對於理解高水平是很好的。 JLS給你絕對的真相。 –

回答

3

java中的異常都以同樣的方式工作。
如果調用該方法的方法拋出一個檢查異常的方法必須嘗試/捕獲該異常,或者將自己的方法聲明爲引發該異常,則檢查和未檢查異常(它們都是RuntimeException的所有子類)之間的區別。

所以,如果我有一個方法:

void throwsACheckedException() throws SomeCheckedException; 

誰要求它必須做的兩件事情之一。或者:

try { 
    throwsACheckedException(); 
} catch (SomeCheckedException e) { 
    //do something 
} 

void someCallingMethod() throws SomeCheckedException { //pass it on 
    throwsACheckedException(); 
} 

unchecked異常你沒有申報,誰就調用方法沒有明確地趕上。例如:

void someInnocentLookingMethod() { 
    throw new NullPointerException("surprise!"); //...extends RuntimeException 
} 

,然後你可以簡單地調用它,沒有的try/catch麻煩:

void unsuspectingVictim() { 
    someInnocentLookingMethod(); 
} 

unchecked異常通常用於東西,可以在任何時候等你爬起來迫使開發人員嘗試/捕捉它們會使代碼非常繁瑣(例如,NullPointerException),儘管有些人檢查異常完全是邪惡的:-)

4

檢查的異常要求您向方法簽名添加throws聲明,或者在其周圍添加一個trycatch塊。

public void checked() throws IOException { 
    throw new IOException(); // compiles just fine 
} 

public void checked() { 
    try { 
    throw new IOException(); 
    } catch (IOException e) { 
    // ... 
    } 
} 

這是行不通的:

public void checkedWithoutThrows() { 
    throw new IOException(); // will not compile 
} 

一個未經檢查的異常並不需要這個。

public void unchecked() { 
    throw new RuntimeException(); 
} 

而且,只是爲了完整起見,辦法確定從檢查的異常未經檢查的是unchecked異常從RuntimeException所有下降在某一點或其他。

+0

如果在匹配的'try'塊中包含異常源(拋出'語句或調用引發異常的方法),則不必爲方法簽名添加'throws'聲明catch條款。 –

+0

謝謝@TedHopp。更新了答案。 – yamafontes

2

對於檢查異常,您會看到編譯時出錯,並說你必須處理th EM。 運行時異常不會提供任何錯誤或警告來處理您的代碼。

編譯器期望異常(檢查異常)並要求您處理它。