<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-314  評論-209  文章-0  trackbacks-0

    Java提供了兩類主要的異常:runtime exception和checked exception。所有的checked exception是從java.lang.Exception類衍生出來的,而runtime exception則是從java.lang.RuntimeException或java.lang.Error類衍生出來的。

    它們的不同之處表現在兩方面:機制上和邏輯上。

      一、機制上

      它們在機制上的不同表現在兩點:1.如何定義方法;2. 如何處理拋出的異常。請看下面CheckedException的定義:

    public class CheckedException extends Exception
    {
     public CheckedException() {}
     public CheckedException( String message )
     {
      super( message );
     }
    }

      以及一個使用exception的例子:

    public class ExceptionalClass
    {
     public void method1()
      throws CheckedException
      {
       // ... throw new CheckedException( "...出錯了" );
      }
     public void method2( String arg )
      {
       if( arg == null )
       {
        throw new NullPointerException( "method2的參數arg是null!" );
       }
      }
     public void method3() throws CheckedException
      {
       method1();
      }
    }

      你可能已經注意到了,兩個方法method1()和method2()都會拋出exception,可是只有method1()做了聲明。另外,method3()本身并不會拋出exception,可是它卻聲明會拋出CheckedException。在向你解釋之前,讓我們先來看看這個類的main()方法:

    public static void main( String[] args )
    {
     ExceptionalClass example = new ExceptionalClass();
     try
     {
      example.method1();
      example.method3();
     }
     catch( CheckedException ex ) { } example.method2( null );
    }

      在main()方法中,如果要調用method1(),你必須把這個調用放在try/catch程序塊當中,因為它會拋出Checked exception。

      相比之下,當你調用method2()時,則不需要把它放在try/catch程序塊當中,因為它會拋出的exception不是checked exception,而是runtime exception。會拋出runtime exception的方法在定義時不必聲明它會拋出exception。

      現在,讓我們再來看看method3()。它調用了method1()卻沒有把這個調用放在try/catch程序塊當中。它是通過聲明它會拋出method1()會拋出的exception來避免這樣做的。它沒有捕獲這個exception,而是把它傳遞下去。實際上main()方法也可以這樣做,通過聲明它會拋出Checked exception來避免使用try/catch程序塊(當然我們反對這種做法)。

      小結一下:

      * Runtime exceptions:

       在定義方法時不需要聲明會拋出runtime exception;

       在調用這個方法時不需要捕獲這個runtime exception;

       runtime exception是從java.lang.RuntimeException或java.lang.Error類衍生出來的。

      * Checked exceptions:

       定義方法時必須聲明所有可能會拋出的checked exception;

       在調用這個方法時,必須捕獲它的checked exception,不然就得把它的exception傳遞下去;

       checked exception是從java.lang.Exception類衍生出來的。
    二、邏輯上

      從邏輯的角度來說,checked exceptions和runtime exception是有不同的使用目的的。checked exception用來指示一種調用方能夠直接處理的異常情況。而runtime exception則用來指示一種調用方本身無法處理或恢復的程序錯誤。

      checked exception迫使你捕獲它并處理這種異常情況。以java.net.URL類的構建器(constructor)為例,它的每一個構建器都會拋出MalformedURLException。MalformedURLException就是一種checked exception。設想一下,你有一個簡單的程序,用來提示用戶輸入一個URL,然后通過這個URL去下載一個網頁。如果用戶輸入的URL有錯誤,構建器就會拋出一個exception。既然這個exception是checked exception,你的程序就可以捕獲它并正確處理:比如說提示用戶重新輸入。

      再看下面這個例子:

    public void method()
    {
     int [] numbers = { 1, 2, 3 };
     int sum = numbers[0] + numbers[3];
    }

      在運行方法method()時會遇到ArrayIndexOutOfBoundsException(因為數組numbers的成員是從0到2)。對于這個異常,調用方無法處理/糾正。這個方法method()和上面的method2()一樣,都是runtime exception的情形。上面我已經提到,runtime exception用來指示一種調用方本身無法處理/恢復的程序錯誤。而程序錯誤通常是無法在運行過程中處理的,必須改正程序代碼。

      總而言之,在程序的運行過程中一個checked exception被拋出的時候,只有能夠適當處理這個異常的調用方才應該用try/catch來捕獲它。而對于runtime exception,則不應當在程序中捕獲它。如果你要捕獲它的話,你就會冒這樣一個風險:程序代碼的錯誤(bug)被掩蓋在運行當中無法被察覺。因為在程序測試過程中,系統打印出來的調用堆棧路徑(StackTrace)往往使你更快找到并修改代碼中的錯誤。有些程序員建議捕獲runtime exception并紀錄在log中,我反對這樣做。這樣做的壞處是你必須通過瀏覽log來找出問題,而用來測試程序的測試系統(比如Unit Test)卻無法直接捕獲問題并報告出來。

      在程序中捕獲runtime exception還會帶來更多的問題:要捕獲哪些runtime exception?什么時候捕獲?runtime exception是不需要聲明的,你怎樣知道有沒有runtime exception要捕獲?你想看到在程序中每一次調用方法時,都使用try/catch程序塊嗎?

    --------------附加程序-------------------------

    public class Junk {
    //     public static void main(String args[]) {
    //         try {
    //             a();
    //         } catch(HighLevelException e) {
    //             e.printStackTrace();
    //         }
    //     }
        
         public static void main(String args[]) {
             try {
                 a();
             } catch(Exception e) {
                 e.printStackTrace();
                 System.out.println("-------------------------");
                 System.out.println(e.getMessage());
             }
         }
        
        
         static void a() throws HighLevelException {
             try {
                 b();
             } catch(MidLevelException e) {
                 throw new HighLevelException(e);
             }
         }
         static void b() throws MidLevelException {
             c();
         }  
         static void c() throws MidLevelException {
             try {
                 d();
             } catch(LowLevelException e) {
                 throw new MidLevelException(e);
             }
         }
         static void d() throws LowLevelException {
            e();
         }
         static void e() throws LowLevelException {
             throw new LowLevelException("e throw exception!");
         }
     }

     class HighLevelException extends Exception {
         HighLevelException(Throwable cause) { super(cause); }
         HighLevelException(String message,Throwable cause) {
          super(message,cause);
         }
     }

     class MidLevelException extends Exception {
         MidLevelException(Throwable cause)  { super(cause); }
         MidLevelException(String message,Throwable cause)  {
          super(message,cause);
         }
     }
     
     class LowLevelException extends Exception {
      public LowLevelException(){
      }
      public LowLevelException(String message){
       super(message);
      }
     }
     

    posted on 2006-08-24 21:08 xzc 閱讀(228) 評論(0)  編輯  收藏 所屬分類: Java
    主站蜘蛛池模板: 亚洲成a人片在线播放| 亚洲Av无码乱码在线播放| 久久综合图区亚洲综合图区| 精品国产免费人成网站| 亚洲精品国产V片在线观看| 亚洲精品黄色视频在线观看免费资源| 又粗又硬免费毛片| a级毛片免费观看网站| 亚洲va中文字幕无码久久不卡| 久久精品国产影库免费看| 内射干少妇亚洲69XXX| aa级一级天堂片免费观看| 亚洲人成网站色在线观看| 日本免费v片一二三区| 一边摸一边桶一边脱免费视频| 亚洲人成色77777| 2021在线永久免费视频| 亚洲人成网站色7799| 亚洲av无码天堂一区二区三区| 99热在线日韩精品免费| 亚洲精品视频专区| 国产猛烈高潮尖叫视频免费 | 免费一级毛片在级播放| 男女啪啪免费体验区| 亚洲国产精品成人精品无码区在线| 99热免费在线观看| 国产成人人综合亚洲欧美丁香花| 久久亚洲国产精品123区| 国产精品白浆在线观看免费| 亚洲综合伊人制服丝袜美腿| 亚洲成a人片在线播放| 50岁老女人的毛片免费观看| 精品国产日韩亚洲一区91| 亚洲国产精品VA在线观看麻豆| 噼里啪啦电影在线观看免费高清| 国产午夜亚洲精品不卡免下载| 久久亚洲国产伦理| 国产精品色午夜视频免费看| 无码日韩精品一区二区三区免费| 亚洲卡一卡二卡乱码新区| 亚洲中文字幕无码久久2017|