若是方法設計流程中發生異常,而你設計時並無充足的信息知道該如何處理(例如不知道連接庫會用在什麼環境),那麼能夠拋出異常,讓調用方法的客戶端來處理。spa
操做對象的過程當中若是會拋出受檢異常,但目前環境信息不足以處理異常,沒法使用try...catch處理時,可由方法的客戶端依據當時調用的環境信息進行處理。爲了告訴編譯程序這個事實,必須使用throws聲明此方法會拋出的異常類型或父類型,編譯程序纔會讓你經過編譯。設計
拋出受檢異常,表示你認爲調用方法的客戶端有能力且應該處理異常,throws聲明部分會是API操做接口的一部分,客戶端不用查看原始碼,從API文件上就能直接得知,該方法可能拋出哪些異常。對象
若是你認爲客戶端調用方法的時機不當引起了某個錯誤,但願客戶端準備好前置條件,再來調用方法,這時能夠拋出非受檢異常讓客戶端得知此狀況,若是是非受檢異常,編譯程序不會明確要求使用try...catch或在方法上使用throws聲明,由於Java會認爲非受檢異常是程序設計不當引起的BUG,異常應自動向外傳播,不該使用try...catch來嘗試處理,而應改善程序邏輯來避免引起錯誤。繼承
實際上在異常發生時,可以使用try...catch處理當時環境可進行的異常處理,當時環境下沒法決定如何處理的部分,能夠拋出由調用方法的客戶端處理。接口
在catch代碼塊進行完部分錯誤處理以後,可使用throw(注意不是throws)將異常再拋出,實際上,能夠在任何流程中拋出異常,不必定要在catch代碼塊中,在流程中拋出異常,就直接調離原有的流程,能夠拋出受檢或非受檢異常,若是拋出的是受檢異常,表示你認爲客戶端有能力且應處理異常,此時必須在方法上使用throws聲明,若是拋出的異常是非受檢異常,表示你認爲客戶端調用方法的時機出錯了,拋出異常是要求客戶端修正這個BUG再來調用方法,此時也就不使用throws聲明。編譯
若是使用繼承時,父類某個方法聲明throws某些異常,子類從新定義該方法時能夠:程序設計
a.不聲明throws任何異常;程序
b.throws父類該方法中聲明的某些異常;方法
c.throws父類該方法中聲明異常的子類;客戶端
可是不能夠:
a.throws父類方法中未聲明的其餘異常;
b.throws父類方法中聲明異常的父類。