posts - 37, comments - 8, trackbacks - 0, articles - 0

          java基礎(chǔ):關(guān)于異常處理

          Posted on 2008-08-05 06:00 夢與橋 閱讀(262) 評論(0)  編輯  收藏 所屬分類: java基礎(chǔ)

          1、異常處理機制:Java中定義了很多異常類,每個異常類都代表一種運行錯誤,類中包含了該運行錯誤的信息和處理錯誤的方法等內(nèi)容。每當(dāng)Java程序運行過程中發(fā)生一個可識別的運行錯誤時,即該錯誤有一個異常類與之對應(yīng)時,系統(tǒng)都會產(chǎn)生一個相應(yīng)的該異常的對象,即產(chǎn)生一個異常。一旦異常對象產(chǎn)生,系統(tǒng)就一定有相應(yīng)的機制來處理它,確保不會產(chǎn)生死機、死循環(huán)或其他對OS的損害,從而保證程序運行的安全性。
          2、異常的類層次:Throwable類是所有異常和錯誤類的最上層,此類派生了兩個子類:Exception類和Error類。Exception類是所有異常類的父類,Error類是所有錯誤類的父類,前者供程序使用,后者由系統(tǒng)保留。所有的異常類都分布在:java.lang、java.io、java.util、java.net包中。
          3、異常的處理:Java異常處理通過5個關(guān)鍵字控制:try、catch、throw、throws和finally
          4、try-catch-finally結(jié)構(gòu)
          語法格式:
          try{                               //try語句塊 
              需要檢查的語句;//拋出具體的異常代碼
              }
          cathc(異常類名1  變量名)//catch語句塊
              {
              異常類發(fā)生時的處理語句;
              ……
              }
          ……
          catch(異常類名n  變量名)//catch語句塊
              {
              異常類發(fā)生時的處理語句;
              ……
              }
              finally                    //finally語句塊
              {
              必須要執(zhí)行的語句;
              }
                  注:try用來捕獲異常,catch用來處理相應(yīng)異常,finally用以進行異常清理。
          5、throw語句——產(chǎn)生異常
          實例:
          public class Test
          {
           static void throwDemo()
           {
            try
            {
             throw new NullPointerException("demo");
            }
            catch (NullPointerException e)
            {
             System.out.println("Caught inside demoproc.");
             throw e;//重新拋出異常
            }
           }
           public static void main(String args[])
           {
            //main方法捕捉并處理throwDemo拋出的異常
            try
            {
             throwDemo();
            }
            catch (NullPointerException e)
            {
             e.printStackTrace();
            }
           }
          }
          6、throws語句:如一個定義的方法中存在異常,可在方法聲明的后面加上throws關(guān)鍵字將異常拋出到此方法的調(diào)用方法中。
          例子:
          public class Test
          {
           static void throwDemo() throws NullPointerException
           {
            System.out.println("Caught inside demoproc.");
            throw new NullPointerException("demo");
           }
           public static void main(String args[])
           {
            //main方法捕捉并處理throwDemo拋出的異常
            try
            {
             throwDemo();
            }
            catch (NullPointerException e)
            {
             e.printStackTrace();
            }
           }
          }

          7、自定義異常類:某個應(yīng)用程序所特有的運行錯誤,需要開發(fā)人員根據(jù)實際情況創(chuàng)建自己的異常類。自定義的異常類必須是Throwable類的直接或間接子類,實際應(yīng)用中,通常以Exception類作為其直接父類。在異常類中定義其屬性和方法,或者重載父類的屬性和方法。
          例子:
          public class Test
          {
           static void student(double score)throws MyException
           {
            if(score>100)
             throw new MyException(score);
            System.out.println("此學(xué)生的成績是:"+score);
           }
           public static void main(String args[])
           {
            try
            {
             student(80.5);
             student(100.5);
            }
            catch (MyException e)
            {
             //System.out.println(e);
             //printStackTrace()的輸出包含錯誤信息和軌跡
             e.printStackTrace();
            }
           }
          }
          class MyException extends Exception
          {
           //學(xué)生成績>100的異常
           private  double score;
           MyException(double score)
           {
            this.score=score;
           }
           public String toString()
           {
            return "你輸入了>100的成績:"+score;
           }
          }
          8、斷言(assertion):
                  在軟件開發(fā)中,斷言是一種經(jīng)典的調(diào)試和測試方式。Java1.4中新添加了斷言的功能,是Java中的一種新的錯誤檢查機制,提供了一種在代碼中進行正確檢查的機制。在編譯或運行Java程序時,可通過相應(yīng)的參數(shù)來打開或關(guān)閉斷言功能。在實現(xiàn)中,assertion就是在程序中的一條語句,對一個boolean表達式進行檢查,程序正確將為ture,否則為false,此時系統(tǒng)將給出警告或退出。
                  斷言包括:assert關(guān)鍵字,assertionerror類,以及在java.lang.classloader中幾個新的有關(guān)斷言的方法。一般來說,assertion用于保證程序最基本、關(guān)鍵的正確性。
                  斷言有兩種合法的形式:
                                              §assert expression1;
                                              §assert expression1:expression2;
                  expression1表示一個布爾表達式,expression2表示一個基本類型或者一個對象,基本類型包括boolan、char、double、float、int和long,由于所有類都是Object的子類,因而可以處理一切對象。運行時,如打開斷言功能,expresson1將被計算,若計算的值為flase,此語句將拋出一個AssertionError對象。如果assertion語句包括expression2,程序?qū)⒂嬎愠鰁xpression2的結(jié)果,然后將這個結(jié)果作為AssertionError的構(gòu)造函數(shù)的參數(shù),來創(chuàng)建AssertionError對象,并拋出此對象。若計算的值為true,expresson2將不被計算。如果在計算表達式時,表達式本身拋出異常,那么assert將停止運行,而拋出這個異常。
                  斷言程序的編譯:必須使用JDK1.4及比其更新版本,在使用javac命令時,必須加上-source 1.4,一個簡單的例子:javac -source 1.4 Test.java
                  斷言的使用是一個復(fù)雜的問題,將涉及程序的風(fēng)格、斷言運用的目標(biāo)、程序的性質(zhì)等。通常來說,用來檢查一些關(guān)鍵值,這些值對整個程序或者局部功能的完成有很大的影響,這種錯誤是不容易恢復(fù)的。
                          §檢查控制流:在if-then和switch-case語句中,可以在不該被執(zhí)行的控制流之上,加assert false語句。
                                  例子:程序只能取1、2、3。
                                  switch(x)
                                     {
                                         case 1:。。;
                                         case 2:。。;
                                         case 3:。。;
                                         default:assert false:"x value is invalid:"+x;
                                      }
                          §在私有函數(shù)計算前,檢查輸入?yún)?shù)是否有效。對一地一些私有函數(shù),要求輸入滿足一些特定的條件,可在函數(shù)開始處使用asser進行參數(shù)檢查。對于公共函數(shù),通常不用,因為一般來說,公共函數(shù)必須對無效的參數(shù)進行檢查和處理,而私有函數(shù)是直接使用的。如某函數(shù)要求輸入的參數(shù)必須不為null,可以在函數(shù)開始加上斷言:assert parameter1!null:"paramerter is null in test metod";
                          §在函數(shù)計算后,檢查函數(shù)結(jié)果是否有效。對于一些計算函數(shù),運行完成后,某些值需要保證一定的性質(zhì),如有一個計算絕對值的函數(shù):assert value>=0:"value should be bigger than 0:"+value; 
                          §檢查不變量,有些程序中存在一些不變量,在程序的運行生命周期,這些變量的值都是不變的。這些不變量可能是一簡單的表達式,也可能是一個復(fù)雜的表達式。對于一些關(guān)鍵的不變量,可以通過assert進行檢查。如在一個財會系統(tǒng)中,公司的支出和收入必須保持一定的平衡關(guān)系,編寫一個表達式檢查平衡關(guān)系。
          private boolean isBalance()
          {
          ............
          }
          在這個系統(tǒng)中,在一些可能影響這種平衡關(guān)系的方法前后,都可以加上斷言驗證:
          assert isBalnace():"balance is destoried";
          主站蜘蛛池模板: 舟山市| 綦江县| 通榆县| 浮梁县| 青田县| 翁源县| 乐亭县| 乌拉特后旗| 临洮县| 康平县| 林口县| 潞西市| 岫岩| 合肥市| 寿光市| 尉氏县| 巴东县| 犍为县| 十堰市| 巢湖市| 乌兰浩特市| 绥宁县| 盐城市| 临夏县| 十堰市| 忻州市| 天柱县| 舞钢市| 米泉市| 固始县| 方正县| 施甸县| 扎兰屯市| 信宜市| 长子县| 益阳市| 云安县| 海原县| 交城县| 漠河县| 虞城县|