明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

Java編程思想讀書筆記(10章下)

[摘要]四. 繼承中異常   1. 關(guān)于構(gòu)造函數(shù)中的異常    1.1 構(gòu)造函數(shù)中的異常規(guī)則    某個(gè)derivedclass構(gòu)造函數(shù)的“異常規(guī)格接口“可以比其所調(diào)用的父類的構(gòu)造函數(shù)的異常規(guī)格接口寬,但決不能變窄。    1) derivedclass的構(gòu)造函數(shù)必須在自己的異常規(guī)格中聲明所有basecl...
四. 繼承中異常

  1. 關(guān)于構(gòu)造函數(shù)中的異常

   1.1 構(gòu)造函數(shù)中的異常規(guī)則

   某個(gè)derivedclass構(gòu)造函數(shù)的“異常規(guī)格接口“可以比其所調(diào)用的父類的構(gòu)造函數(shù)的異常規(guī)格接口寬,但決不能變窄。

   1) derivedclass的構(gòu)造函數(shù)必須在自己的異常規(guī)格中聲明所有baseclass構(gòu)造函數(shù)的異常規(guī)格中所聲明的異常。

   2) 在derivedclass的構(gòu)造函數(shù)的異常規(guī)格中還可以聲明新的異常,即聲明在baseclass構(gòu)造函數(shù)的異常規(guī)格中沒有聲明的異常。

   1.2 原因

   當(dāng)在產(chǎn)生一個(gè)derivedclass的對(duì)象時(shí),會(huì)在derivedclass的構(gòu)造函數(shù)中調(diào)用baseclass的構(gòu)造函數(shù)(初始化過程請(qǐng)見第6章),所以在derivedclass的構(gòu)造函數(shù)中可能會(huì)拋出baseclass構(gòu)造函數(shù)的異常規(guī)格中聲明的異常,因此要在derivedclass的異常規(guī)格中聲明baseclass構(gòu)造函數(shù)的異常規(guī)格中聲明的異常。

   **:如果調(diào)用的函數(shù)的異常規(guī)格中聲明了異常,那么在調(diào)用該函數(shù)的時(shí)候要捕捉它的異常規(guī)格中聲明的異常。但在derivedclass構(gòu)造函數(shù)中卻無法捕捉其baseclass構(gòu)造函數(shù)所擲出的異常。

   2. 關(guān)于非構(gòu)造函數(shù)的異常規(guī)則

   2.1 某個(gè)函數(shù)的“異常規(guī)格接口“在繼承和重載中可以變窄,但決不能變寬

   要覆寫baseclass的函數(shù)時(shí),如果被覆寫函數(shù)(baseclass中的函數(shù))的異常規(guī)格中聲明了異常,那么覆寫函數(shù)(derivedclass中覆寫了baseclass中的函數(shù)的那個(gè)函數(shù))的異常規(guī)格中可以聲明(1)與被覆寫函數(shù)完全相同的異常;(2)被覆寫函數(shù)異常規(guī)格中的部分異;蚱渥宇惍惓;(3)不聲明異常規(guī)格。

   2.2 原因

   這么做是為了滿足“能處理被覆寫函數(shù)的代碼,不用做任何修改就能處理覆寫函數(shù)的代碼”的原則。

   如果覆寫函數(shù)的異常規(guī)格中聲明了在被覆寫函數(shù)的異常規(guī)格中不存在的異常,那么能處理被覆寫函數(shù)的代碼就不能處理覆寫函數(shù),因?yàn)闆]有捕捉覆寫函數(shù)中不存在于被覆寫函數(shù)中的異常聲明。

   import java.sql.SQLException;
   class BaseClass{
   public void f(){}
   }
   class DerivedClass1 extends BaseClass{
   //public void f() throws SQLException {}(1)

   public void f() {}//(2)

   }
   public class Test{
   public static void f(BaseClass bc) { bc.f(); }
   /*(3)

   public static void f(BaseClass bc) {
   try{
   bc.f();
   }
   catch(SQLException ex){}
   }
   */
   public static void main(String[] args){
   BaseClass bc = new BaseClass();
   f(bc);
   DerivedClass1 dc = new DerivedClass1();
   f(bc);
   }
   }
   如果允許“異常接口“變寬,我們看看上面代碼會(huì)出現(xiàn)什么結(jié)果。首先,我們可以將代碼(1)的注釋去掉,并注釋掉代碼(2)。由于BaseClassclass中的被覆寫f()函數(shù)沒有聲明異常規(guī)格,而代碼(1)中覆寫f()函數(shù)聲明了,那么Testclass中的f(BaseClass bc)雖然能處理被覆寫f()函數(shù)的調(diào)用,但不能處理覆寫f()函數(shù)的調(diào)用,因?yàn)榇a覆寫f()函數(shù)聲明了異常規(guī)格,而f(BaseClass bc)沒有進(jìn)行捕捉。那么為了處理覆寫f()函數(shù),我們還要編寫代碼(3)那樣的處理函數(shù)。

   2.3 產(chǎn)生對(duì)象的異常規(guī)則

   在產(chǎn)生一個(gè)對(duì)象時(shí),捕捉的是產(chǎn)生對(duì)象時(shí)所調(diào)用的構(gòu)造函數(shù)中所聲明的異常。

   2.4 函數(shù)調(diào)用時(shí)的異常規(guī)則

   1) 當(dāng)把一個(gè)對(duì)象向上轉(zhuǎn)型為它的baseclass時(shí),并通過轉(zhuǎn)型后的reference進(jìn)行函數(shù)調(diào)用時(shí),我們要捕捉的是其baseclass的異常聲明。

   2) 當(dāng)用對(duì)象的原始類型來調(diào)用函數(shù)時(shí),只需捕捉所調(diào)用的覆寫函數(shù)的異常