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

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

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

    csusky

    常用鏈接

    統計

    最新評論

    JAVA中的異常處理

    在JAVA中,如果某個方法不能夠按照正常的途徑完成它的任務,就可以通過另外一個途徑退出方法。在這種情況下,方法并不立刻返回,而是拋出一個封裝了錯誤信息的對象。需要注意的是,這個方法將會立刻退出,且并不返回正常情況下的值。此外,調用這個方法的代碼也將無法執行,取而代之的是,異常處理機制開始搜索能夠處理這種錯誤條件的異常處理器。

    如果在子類中覆蓋了超類的一個方法,那么子類方法聲明的已檢查異常不能超過超類方法中聲明的異常圍。(也就是說子類中拋出的異常范圍更小或者根本不拋出異常)。需要說明的是,如果超類方法沒有拋出任何異常,子類也不能拋出任何已檢查異常。例如,如果覆蓋JComponent.paintComponent()方法,那么    由于超類中沒有拋出任何異常,所以自定義的paintComponent()方法也不能拋出任何異常。

    如何拋出異常:
    譬如在讀一個輸入流時,如果期待的字節數為1024,而當讀到700字節的時候遇到一個EOF信號,這是我們未預期的,正是我們要拋出的異常,下面就是拋出改異常的語句

    1String readData() throws EOFException {
    2   while ({
    3      if(!in.hasNext()) {
    4          if(n<len)
    5            throw new EOFException();
    6     }
      
    7  }

    8}

    這是拋出已存在標準的異常,步驟為:
    1.找到一個合適的異常類
    2.創建該類的對象
    3.將異常拋出
    一旦拋出異常,該方法就不可能返回到調用者,這就意味著不必為返回的默認值或錯誤代碼擔憂了。

    在程序中可能會遇到任何標準異常都無法正確描述清楚的問題,這時候就需要定義自己的異常類,定義自己的異常類需要繼承自Exception 或者其子類,如繼承自IOException  一般要為自定義的Exception定義兩個構造函數,一個是默認的無參的構造函數,另一個是帶一個描述詳細錯誤信息String的構造函數(超類的toString()方法會打印出這些詳細信息。

    1public class MyException extends IOException {
    2
    3    MyException () {}
    4    
    5    MyException (String info) {
    6       super(info);
    7   }

    8}

    現在就可以像使用標準Exception類一樣使用自定義的Exception類了

    1String readData() throws MyException {
    2   while () {
    3      if(!in.hasNext()) {
    4          if(n<len)
    5            throw new MyException();
    6    }
      
    7 }

    8}

    可以用超類Throwable類的getMessage方法得到詳細的錯誤描述信息。或者toString()方法打印該信息。

    捕獲異常:
    如果語句exp1有可能拋出一個異常,或者說是調用了能夠拋出一個異常的方法,那么我們可以在程序中捕獲該異常

    1try {
    2 exp1;
    3 exp2;
    4 .
    5
    6}
     catch(Exception e) {
    7   e.
    8}

    9

    或者是并不捕獲,再次拋出該異常

    再次拋出異常,異常鏈:
    可以在catch塊中再次拋出新的異常,這樣可以隱藏原始的錯誤細節

    1catch(SQLException sqle) {
    2    throw new ServletException("caused by SQLException "+e.getMessage());
    3}

    另一種更好的方法
    既拋出高級的異常,又不會丟失原始的異常信息。

    1}catch(SQLException sqle) 
    2    Throwable ta=new ServletException("caused by SQLException");
    3    ta.setCause(e);
    4    throw ta;
    5}

    6當捕獲拋出的異常ta時,可以用ta.getCause(),得到原始的異常


    finally子句,發生三種情況時,會執行finally子句
    1.try代碼正常執行
    2.try代碼拋出一個在catch子句中捕獲的異常
    3.try代碼拋出一個未在catch子句中捕獲的異常
    就是說無論異常如何,finally子句中的代碼都會執行
    一般把一些資源回收的工作交給finally子句

    最好把try-catch塊和try-finally塊分開,這樣可以提高代碼的清晰度

     1try {
     2   try {
     3      //可能拋出IOException的語句
     4    }
     finally {
     5    is.close();
     6 }

     7}
     catch(IOExceotion e) {
     8   
     9}

    10

    這樣的另外一個好處是,可以catch到finally子句中拋出的異常。這也就引發了另外一個問題,如果在try和finally中都拋出了異常,而且是不同類型的,那么最后返回的是那一個呢?答案是finally中拋出的異常會覆蓋try中拋出的異常。從而丟失了try當中拋出的異常信息,讓拋出該方法的使用者不能跟蹤異常信息。所以,在finally中執行的語句最好是不要拋出異常,但是不幸的是我們有時候不得不在finally中執行一些清楚操作如:關閉輸入流InputStream,但是InputStream類的設計者并沒有這么設計(將會拋出異常)。

    由于finally子句總是會執行,所以在finally中包含return值時,是很危險的。假設我們利用return語句從try中返回,在方法返回之前finally子句的內容將會被執行。如果finally子句當中也包含一個return 語句,那么這個return語句所返回的值,將會覆蓋原先return的值。

    1public int f(int n) {
    2  try {
    3      return n*n;
    4    }
     finally {
    5     if(n==2)
    6       return 2;
    7  }

    8}

    在這里如果調用i=f(2);那么i的值將會是2而不是期望的2*2=4


    最后最重要的一點,關于一個方法是捕獲一個異常還是拋出給調用他的方法
    有一點規則   
                                    早拋出,晚捕獲,盡量把異常拋出給調用它的函數

    posted on 2008-02-26 14:05 曉宇 閱讀(529) 評論(0)  編輯  收藏 所屬分類: JAVA基礎

    主站蜘蛛池模板: 午夜免费国产体验区免费的| 国产成人精品亚洲日本在线| 农村寡妇一级毛片免费看视频| 一二三四免费观看在线视频中文版| 亚洲网站在线观看| 九九精品成人免费国产片| 亚洲精品国产精品乱码不卡√| 成全视成人免费观看在线看| 久久久久久亚洲精品不卡| www在线观看播放免费视频日本| 亚洲人成人网站在线观看| CAOPORM国产精品视频免费| 久久国产成人亚洲精品影院| 中文字幕无线码中文字幕免费| 亚洲中文字幕无码一区二区三区| 成人网站免费看黄A站视频| 亚洲AV福利天堂一区二区三| 亚洲视频免费在线播放| 亚洲偷自精品三十六区| 在线观看91精品国产不卡免费| 国产精品亚洲一区二区三区久久| 亚洲成人高清在线| a级毛片高清免费视频| 亚洲欧洲精品久久| 欧洲黑大粗无码免费| 老司机午夜精品视频在线观看免费 | 无码人妻一区二区三区免费n鬼沢 无码人妻一区二区三区免费看 | 久久综合亚洲色HEZYO国产| 福利免费在线观看| 久久久久亚洲AV无码专区首JN| 四虎成年永久免费网站| 亚洲а∨精品天堂在线| 亚洲亚洲人成综合网络| 免费人成在线观看69式小视频| 亚洲av无码有乱码在线观看| 在线亚洲精品自拍| 国产92成人精品视频免费| 亚洲av第一网站久章草| 久久亚洲国产精品| 永久免费bbbbbb视频| 91视频免费观看|