基於java觸及父子類的異常詳解。本站提示廣大學習愛好者:(基於java觸及父子類的異常詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是基於java觸及父子類的異常詳解正文
java中的異常觸及到父子類的成績,可以歸結為一句話:子類的結構函數拋出的異常必需包括父類的異常,子類的辦法可以選擇拋出“規模小於等於”父類的異常或不拋出異常。
1. 為何結構函數必需拋出包括父類的異常?
在《thingking in java》中有這麼一段話:
異常限制:當籠罩辦法時,只能拋出在基類辦法的異常解釋中列出的那些異常
異常限制對結構器不起感化,你會發明StormyInning的結構器可以拋出任何異常,而不用理睬基類結構函數所拋出的異常。但是由於必需結構函數必需以如許或那樣的方法被挪用,子類結構函數的異常解釋必需包括基類結構器的異常解釋
這段話起先一開比擬繞,然則嘻嘻看一遍就會明確:
起首,異常解釋只針對籠罩辦法,而結構函數顯著不在這個規模,所以子類結構函數可以拋出任何異常,而不消顧及父類結構函數所拋出的異常。然則在new 一個子類對象的時刻,父類結構函數必定會被挪用,所以子類結構函數挪用的對應的父類結構函數所拋出的異常就必需斟酌在內,此時又由於“子類結構函數沒法捕捉父類結構函數所拋出的異常(前面會提)”,所以子類結構函數必需拋出這個異常。
class SomeException extends Exception{} class TheOtherException extends Exception{} class BaseC { public BaseC()throws SomeException{} public BaseC(int a)throws TheOtherException{} } class SubC extends BaseC { public SubC() throws SomeException //假如不拋出異常就會報錯 { super(); //因為挪用的基類的默許結構函數, 所以要拋出SomeException //super(37) ; //假如將super()調換成這裡,就必需拋出TheOtherException } }
2. 為何子類結構函數沒法捕捉父類結構函數所拋出的異常?
由於子類假如想要捕捉父類拋出的異常,就必需顯示地挪用super() ; 或許super(xxx...); 但是super()和this()這些都有一個特征, 就是必需將他們放在第一行, 這與try{}catch{}相抵觸, 所以沒法捕捉
3. 當子類繼續的父類和接口存在雷同的辦法名時,這時候的處置方法就必需遵守異常限制。
class SomeException extends Exception{} class TheOtherException extends Exception{} interface InterF { public void function()throws TheOtherException; } class BaseC { public void function()throws SomeException{} } class SubC extends BaseC implements InterF { //此時只能選擇不拋出異常 public void function(){} //報錯:Exception SomeException is not compatible with throws clause in InterF.function() // public void function()throws SomeException{} ; //報錯:Exception TheOtherException is not compatible with throws clause in BaseC.function() // public void function()throws TheOtherException{} ; }
4. 為何子類只能拋出在基類辦法的異常解釋中列出的那些異常?
由於子類存在向上轉化成父類的能夠性,假如許可子類隨便拋出異常的話,那末向上轉化成父類時,該辦法的接口(權且這麼叫吧)會釀成父類的辦法類型,此時成績來了,子類會拋出異常,而父類卻沒法對該異常做出處置,所認為包管對象的可調換型,強迫請求“只能拋出在基類辦法的異常解釋中列出的那些異常”。
這裡所說的“那些異常”還包含這些異常的子異常!
5. 這一點不曉得算不算,或許是我比擬癡頑吧,我在看的時刻想了很久才明確過去,權且記上去吧。
class SomeException extends Exception{} class BaseC { public void function()throws SomeException{}//假如這裡拋出的異常是一個運轉時異常子類便可以纰謬其停止異常處置 } class SubC extends BaseC {<BR>//這兩個function()所停止的super.function()的都屬於正常的函數挪用,不屬於異常處置的規模, 然則這個函數自己要相符異常處置的標准! /* public void function()throws SomeException { super.function(); } */ public void function() { try { super.function() ; } catch(SomeException e) { e.printStackTrace(); } } }
以上這篇基於java觸及父子類的異常詳解就是小編分享給年夜家的全體內容了,願望能給年夜家一個參考,也願望年夜家多多支撐。