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

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

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

    csusky

    常用鏈接

    統(tǒng)計

    最新評論

    JAVA中的異常處理

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

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

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

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

    8}

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

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

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

    8}

    現(xiàn)在就可以像使用標(biāo)準(zhǔn)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方法得到詳細的錯誤描述信息?;蛘遲oString()方法打印該信息。

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

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

    9

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

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

    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當(dāng)捕獲拋出的異常ta時,可以用ta.getCause(),得到原始的異常


    finally子句,發(fā)生三種情況時,會執(zhí)行finally子句
    1.try代碼正常執(zhí)行
    2.try代碼拋出一個在catch子句中捕獲的異常
    3.try代碼拋出一個未在catch子句中捕獲的異常
    就是說無論異常如何,finally子句中的代碼都會執(zhí)行
    一般把一些資源回收的工作交給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子句中拋出的異常。這也就引發(fā)了另外一個問題,如果在try和finally中都拋出了異常,而且是不同類型的,那么最后返回的是那一個呢?答案是finally中拋出的異常會覆蓋try中拋出的異常。從而丟失了try當(dāng)中拋出的異常信息,讓拋出該方法的使用者不能跟蹤異常信息。所以,在finally中執(zhí)行的語句最好是不要拋出異常,但是不幸的是我們有時候不得不在finally中執(zhí)行一些清楚操作如:關(guān)閉輸入流InputStream,但是InputStream類的設(shè)計者并沒有這么設(shè)計(將會拋出異常)。

    由于finally子句總是會執(zhí)行,所以在finally中包含return值時,是很危險的。假設(shè)我們利用return語句從try中返回,在方法返回之前finally子句的內(nèi)容將會被執(zhí)行。如果finally子句當(dāng)中也包含一個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}

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


    最后最重要的一點,關(guān)于一個方法是捕獲一個異常還是拋出給調(diào)用他的方法
    有一點規(guī)則   
                                    早拋出,晚捕獲,盡量把異常拋出給調(diào)用它的函數(shù)

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

    主站蜘蛛池模板: 一级特级aaaa毛片免费观看| 久久精品7亚洲午夜a| 免费观看a级毛片| 老湿机一区午夜精品免费福利| 99在线观看视频免费| 久久亚洲最大成人网4438| 亚洲av无码国产精品色在线看不卡| 国产精品极品美女自在线观看免费| 亚洲AV日韩AV永久无码免下载| 国产精品视频永久免费播放| 亚洲日韩国产精品无码av| 久久免费线看线看| 亚洲成A人片777777| a级片在线免费看| 亚洲一区二区三区高清视频| 国产妇乱子伦视频免费| 一道本在线免费视频| 亚洲乱码卡三乱码新区| 18禁免费无码无遮挡不卡网站 | 亚洲第一黄色网址| 最近免费最新高清中文字幕韩国 | 成人福利在线观看免费视频| 亚洲美女中文字幕| 91成人免费在线视频| 一区在线免费观看| 亚洲中文字幕一二三四区| 女人与禽交视频免费看| 无码国产精品一区二区免费vr| 亚洲国产香蕉碰碰人人| 免费在线观看中文字幕| 69成人免费视频无码专区| 99久热只有精品视频免费看| 国产成人精品免费大全| 亚洲午夜成人精品无码色欲| 亚洲Av无码专区国产乱码DVD| 免费少妇a级毛片人成网| 好男人看视频免费2019中文 | 精品在线免费观看| 一级特黄a免费大片| 亚洲aⅴ无码专区在线观看| 亚洲图片中文字幕|