閱讀有關本book例外,我發現這樣的說法:檢查和未檢查異常在Java中如何工作?
經過異常是由在編譯時,編譯器檢查。
和
編譯器不檢查在編譯時未檢查異常。
所以,如果我們也可以說,IOException
或SQLException
是檢查異常分類如下。 java編譯器怎麼知道會有一個例外,沒有爲IllegalArgumentException
這威力保持裏面的代碼是我的理解。
此外,究竟是被強制性取得Checked異常並且不是Unchecked意味着什麼?
閱讀有關本book例外,我發現這樣的說法:檢查和未檢查異常在Java中如何工作?
經過異常是由在編譯時,編譯器檢查。
和
編譯器不檢查在編譯時未檢查異常。
所以,如果我們也可以說,IOException
或SQLException
是檢查異常分類如下。 java編譯器怎麼知道會有一個例外,沒有爲IllegalArgumentException
這威力保持裏面的代碼是我的理解。
此外,究竟是被強制性取得Checked異常並且不是Unchecked意味着什麼?
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),儘管有些人檢查異常完全是邪惡的:-)
檢查的異常要求您向方法簽名添加throws
聲明,或者在其周圍添加一個try
catch
塊。
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
所有下降在某一點或其他。
如果在匹配的'try'塊中包含異常源(拋出'語句或調用引發異常的方法),則不必爲方法簽名添加'throws'聲明catch條款。 –
謝謝@TedHopp。更新了答案。 – yamafontes
對於檢查異常,您會看到編譯時出錯,並說你必須處理th EM。 運行時異常不會提供任何錯誤或警告來處理您的代碼。
編譯器期望異常(檢查異常)並要求您處理它。
忘記所有答案並閱讀[Java語言規範的這一章](http://docs.oracle.com/javase/specs/jls/se7/html/jls-11.html#jls-11.1.1 )。 –
非常有用,謝謝。爲什麼我應該忘記答案?你真的認真嗎? – diegoaguilar
答案對於理解高水平是很好的。 JLS給你絕對的真相。 –