亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

java提高篇-----異常

系統(tǒng) 2393 0

五、自定義異常

????? Java確實(shí)給我們提供了非常多的異常,但是異常體系是不可能預(yù)見所有的希望加以報(bào)告的錯(cuò)誤,所以Java允許我們自定義異常來表現(xiàn)程序中可能會(huì)遇到的特定問題,總之就是一句話:我們不必拘泥于Java中已有的異常類型。

????? Java自定義異常的使用要經(jīng)歷如下四個(gè)步驟:

????? 1、定義一個(gè)類繼承Throwable或其子類。

????? 2、添加構(gòu)造方法(當(dāng)然也可以不用添加,使用默認(rèn)構(gòu)造方法)。

????? 3、在某個(gè)方法類拋出該異常。

????? 4、捕捉該異常。

            
              /**
            
            
               自定義異常 繼承Exception類 *
            
            
              */
            
            
              public
            
            
              class
            
             MyException 
            
              extends
            
            
               Exception{
    
            
            
              public
            
            
               MyException(){
        
    }
    
    
            
            
              public
            
            
               MyException(String message){
        
            
            
              super
            
            
              (message);
    }
}


            
            
              public
            
            
              class
            
            
               Test {
    
            
            
              public
            
            
              void
            
             display(
            
              int
            
             i) 
            
              throws
            
            
               MyException{
        
            
            
              if
            
            (i == 0
            
              ){
            
            
            
              throw
            
            
              new
            
             MyException("該值不能為0......."
            
              );
        }
        
            
            
              else
            
            
              {
            System.out.println( i 
            
            / 2
            
              );
        }
    }
    
    
            
            
              public
            
            
              static
            
            
              void
            
            
               main(String[] args) {
        Test test 
            
            = 
            
              new
            
            
               Test();
        
            
            
              try
            
            
               {
            test.display(
            
            0
            
              );
            System.out.println(
            
            "---------------------"
            
              );
        } 
            
            
              catch
            
            
               (MyException e) {
            e.printStackTrace();
        }
    }
}

            
          

????? 運(yùn)行結(jié)果:

1111

六、異常鏈

????? 在設(shè)計(jì)模式中有一個(gè)叫做責(zé)任鏈模式,該模式是將多個(gè)對(duì)象鏈接成一條鏈,客戶端的請(qǐng)求沿著這條鏈傳遞直到被接收、處理。同樣Java異常機(jī)制也提供了這樣一條鏈:異常鏈。

????? 我們知道每遇到一個(gè)異常信息,我們都需要進(jìn)行try…catch,一個(gè)還好,如果出現(xiàn)多個(gè)異常呢?分類處理肯定會(huì)比較麻煩,那就一個(gè)Exception解決所有的異常吧。這樣確實(shí)是可以,但是這樣處理勢必會(huì)導(dǎo)致后面的維護(hù)難度增加。最好的辦法就是將這些異常信息封裝,然后捕獲我們的封裝類即可。

????? 誠然在應(yīng)用程序中,我們有時(shí)候不僅僅只需要封裝異常,更需要傳遞。怎么傳遞?throws!!binge,正確!!但是如果僅僅只用throws拋出異常,那么你的封裝類,怎么辦??

????? 我們有兩種方式處理異常,一是throws拋出交給上級(jí)處理,二是try…catch做具體處理。但是這個(gè)與上面有什么關(guān)聯(lián)呢?try…catch的catch塊我們可以不需要做任何處理,僅僅只用throw這個(gè)關(guān)鍵字將我們封裝異常信息主動(dòng)拋出來。然后在通過關(guān)鍵字throws繼續(xù)拋出該方法異常。它的上層也可以做這樣的處理,以此類推就會(huì)產(chǎn)生一條由異常構(gòu)成的異常鏈。

??? ?? 通過使用異常鏈,我們可以提高代碼的可理解性、系統(tǒng)的可維護(hù)性和友好性。

????? 同理,我們有時(shí)候在捕獲一個(gè)異常后拋出另一個(gè)異常信息,并且希望將原始的異常信息也保持起來,這個(gè)時(shí)候也需要使用異常鏈。

????? 在異常鏈的使用中,throw拋出的是一個(gè)新的異常信息,這樣勢必會(huì)導(dǎo)致原有的異常信息丟失,如何保持?在Throwable及其子類中的構(gòu)造器中都可以接受一個(gè)cause參數(shù),該參數(shù)保存了原有的異常信息,通過getCause()就可以獲取該原始異常信息。

????? 語法:

            
              public
            
            
              void
            
             test() 
            
              throws
            
            
               XxxException{
        
            
            
              try
            
            
               {
            
            
            
              //
            
            
              do something:可能拋出異常信息的代碼塊
            
            
        } 
            
              catch
            
            
               (Exception e) {
            
            
            
              throw
            
            
              new
            
             XxxException(e
            
              );
        }
    }
            
          

????? 示例:

            
              public
            
            
              class
            
            
               Test {
    
            
            
              public
            
            
              void
            
             f() 
            
              throws
            
            
               MyException{
         
            
            
              try
            
            
               {
            FileReader reader 
            
            = 
            
              new
            
             FileReader("G:\\myfile\\struts.txt"
            
              );  
             Scanner in 
            
            = 
            
              new
            
            
               Scanner(reader);  
             System.out.println(in.next());
        } 
            
            
              catch
            
            
               (FileNotFoundException e) {
            
            
            
              //
            
            
              e 保存異常信息
            
            
              throw
            
            
              new
            
             MyException("文件沒有找到--01"
            
              ,e);
        }  
    }
    
    
            
            
              public
            
            
              void
            
             g() 
            
              throws
            
            
               MyException{
        
            
            
              try
            
            
               {
            f();
        } 
            
            
              catch
            
            
               (MyException e) {
            
            
            
              //
            
            
              e 保存異常信息
            
            
              throw
            
            
              new
            
             MyException("文件沒有找到--02"
            
              ,e);
        }
    }
    
    
            
            
              public
            
            
              static
            
            
              void
            
            
               main(String[] args) {
        Test t 
            
            = 
            
              new
            
            
               Test();
        
            
            
              try
            
            
               {
            t.g();
        } 
            
            
              catch
            
            
               (MyException e) {
            e.printStackTrace();
        }
    }
}
            
          

????? 運(yùn)行結(jié)果:

            com.test9.MyException: 文件沒有找到--02
            
              
    at com.test9.Test.g(Test.java:
            
            31
            
              )
    at com.test9.Test.main(Test.java:
            
            38
            
              )
Caused by: com.test9.MyException: 文件沒有找到
            
            --01
            
              
    at com.test9.Test.f(Test.java:
            
            22
            
              )
    at com.test9.Test.g(Test.java:
            
            28
            
              )
    ... 
            
            1
            
               more
Caused by: java.io.FileNotFoundException: G:\myfile\struts.txt (系統(tǒng)找不到指定的路徑。)
    at java.io.FileInputStream.open(Native Method)
    at java.io.FileInputStream.
            
            <init>(FileInputStream.java:106
            
              )
    at java.io.FileInputStream.
            
            <init>(FileInputStream.java:66
            
              )
    at java.io.FileReader.
            
            <init>(FileReader.java:41
            
              )
    at com.test9.Test.f(Test.java:
            
            17
            
              )
    ... 
            
            2 more
          

????? 如果在程序中,去掉e,也就是:throw new MyException("文件沒有找到--02");

????? 那么異常信息就保存不了,運(yùn)行結(jié)果如下:

            com.test9.MyException: 文件沒有找到--02
            
              
    at com.test9.Test.g(Test.java:
            
            31
            
              )
    at com.test9.Test.main(Test.java:
            
            38)
          

?????? PS:其實(shí)對(duì)于異常鏈鄙人使用的也不是很多,理解的不是很清楚,望各位指正!!!!

七、 異常的使用誤區(qū)

????? 首先我們先看如下示例:該實(shí)例能夠反映java異常的不正確使用(其實(shí)這也是我剛剛學(xué)Java時(shí)寫的代碼)!!

            OutputStreamWriter out = 
            
              null
            
            
              ;
        java.sql.Connection conn 
            
            = 
            
              null
            
            
              ;
        
            
            
              try
            
             {            
            
              //
            
            
                 ---------1
            
            
            Statement stat =
            
               conn.createStatement();
            ResultSet rs 
            
            = stat.executeQuery("select *from user"
            
              );
            
            
            
              while
            
            
               (rs.next()){
                out.println(
            
            "name:" + rs.getString("name") + "sex:"
                        + rs.getString("sex"
            
              ));
            }
            conn.close();         
            
            
              //
            
            
              ------2
            
            
                          out.close();
        } 
        
            
            
              catch
            
             (Exception ex){    
            
              //
            
            
              ------3
            
            
            ex.printStackTrace();    
            
              //
            
            
              ------4
            
            
        }
          

????? ??? 1、-----------1

????? 對(duì)于這個(gè)try…catch塊,我想他的真正目的是捕獲SQL的異常,但是這個(gè)try塊是不是包含了太多的信息了。這是我們?yōu)榱送祽卸B(yǎng)成的代碼壞習(xí)慣。有些人喜歡將一大塊的代碼全部包含在一個(gè)try塊里面,因?yàn)檫@樣省事,反正有異常它就會(huì)拋出,而不愿意花時(shí)間來分析這個(gè)大代碼塊有那幾塊會(huì)產(chǎn)生異常,產(chǎn)生什么類型的異常,反正就是一簍子全部搞定。這就想我們出去旅游將所有的東西全部裝進(jìn)一個(gè)箱子里面,而不是分類來裝,雖不知裝進(jìn)去容易,找出來難啊!!!所有對(duì)于一個(gè)異常塊,我們應(yīng)該仔細(xì)分清楚每塊的拋出異常,因?yàn)橐粋€(gè)大代碼塊有太多的地方會(huì)出現(xiàn)異常了。

????? 結(jié)論一:盡可能的減小try塊!!!

?? ??? 2、--------2

?????? 在這里你發(fā)現(xiàn)了什么?異常改變了運(yùn)行流程!!不錯(cuò)就是異常改變了程序運(yùn)行流程。如果該程序發(fā)生了異常那么 conn.close();? out.close();是不可能執(zhí)行得到的,這樣勢必會(huì)導(dǎo)致資源不能釋放掉。所以如果程序用到了文件、Socket、JDBC連接之類的資源,即使遇到了異常,我們也要確保能夠正確釋放占用的資源。這里finally就有用武之地了:不管是否出現(xiàn)了異常,finally總是有機(jī)會(huì)運(yùn)行的,所以finally用于釋放資源是再適合不過了。

?????? 結(jié)論二:保證所有資源都被正確釋放。充分運(yùn)用finally關(guān)鍵詞。 ?

??????? 3、----------3

?????? 對(duì)于這個(gè)代碼我想大部分人都是這樣處理的,(LZ也是 尷尬 )。使用這樣代碼的人都有這樣一個(gè)心理,一個(gè)catch解決所有異常,這樣是可以,但是不推薦!為什么!首先我們需要明白catch塊所表示是它預(yù)期會(huì)出現(xiàn)何種異常,并且需要做何種處理,而使用Exception就表示他要處理所有的異常信息,但是這樣做有什么意義呢?

????? 這里我們?cè)賮砜纯瓷厦娴某绦驅(qū)嵗茱@然它可能需要拋出兩個(gè)異常信息,SQLException和IOException。所以一個(gè)catch處理兩個(gè)截然不同的Exception明顯的不合適。如果用兩個(gè)catch,一個(gè)處理SQLException、一個(gè)處理IOException就好多了。所以:

?????? 結(jié)論三:catch語句應(yīng)當(dāng)盡量指定具體的異常類型,而不應(yīng)該指定涵蓋范圍太廣的Exception類。 不要一個(gè)Exception試圖處理所有可能出現(xiàn)的異常。 ?

?????? 4、----------4

?????? 這個(gè)就問題多多了,我敢保證幾乎所有的人都這么使用過。這里涉及到了兩個(gè)問題,一是,捕獲了異常不做處理,二是異常信息不夠明確。

????? 4.1、捕獲異常不做處理,就是我們所謂的丟棄異常。我們都知道異常意味著程序出現(xiàn)了不可預(yù)期的問題,程序它希望我們能夠做出處理來拯救它,但是你呢?一句ex.printStackTrace()搞定,這是多么的不負(fù)責(zé)任對(duì)程序的異常情況不理不顧。雖然這樣在調(diào)試可能會(huì)有一定的幫助,但是調(diào)試階段結(jié)束后呢?不是一句ex.printStackTrace()就可以搞定所有的事情的!

????? 那么怎么改進(jìn)呢?有四種選擇:

????? 1、處理異常。對(duì)所發(fā)生的的異常進(jìn)行一番處理,如修正錯(cuò)誤、提醒。再次申明ex.printStackTrace()算不上已經(jīng)“處理好了異常”.

????? 2、重新拋出異常。既然你認(rèn)為你沒有能力處理該異常,那么你就盡情向上拋吧!!!

????? 3、封裝異常。這是LZ認(rèn)為最好的處理方法,對(duì)異常信息進(jìn)行分類,然后進(jìn)行封裝處理。

????? 4、不要捕獲異常。

????? 4.2、異常信息不明確。我想對(duì)于這樣的: java.io.FileNotFoundException: ………信息除了我們IT人沒有幾個(gè)人看得懂和想看吧!所以在出現(xiàn)異常后,我們最好能夠提供一些文字信息,例如當(dāng)前正在執(zhí)行的類、方法和其他狀態(tài)信息,包括以一種更適合閱讀的方式整理和組織printStackTrace提供的信息。起碼我公司是需要將異常信息所在的類、方法、何種異常都需要記錄在日志文件中的。

????? 所以:

?????? 結(jié)論四:既然捕獲了異常,就要對(duì)它進(jìn)行適當(dāng)?shù)奶幚怼2灰东@異常之后又把它丟棄,不予理睬。 不要做一個(gè)不負(fù)責(zé)的人。

?????? 結(jié)論五:在異常處理模塊中提供適量的錯(cuò)誤原因信息,組織錯(cuò)誤信息使其易于理解和閱讀。

????? 對(duì)于異常還有以下幾個(gè)注意地方:

????? 六、不要在finally塊中處理返回值。

???? 七、不要在構(gòu)造函數(shù)中拋出異常。

?

?

八、 try…catch、throw、throws

?????? 在這里主要是區(qū)分throw和throws。

????? throws是方法拋出異常。在方法聲明中,如果添加了throws子句,表示該方法即將拋出異常,異常的處理交由它的調(diào)用者,至于調(diào)用者任何處理則不是它的責(zé)任范圍內(nèi)的了。所以如果一個(gè)方法會(huì)有異常發(fā)生時(shí),但是又不想處理或者沒有能力處理,就使用throws吧!

???? 而throw是語句拋出異常。它不可以單獨(dú)使用,要么與try…catch配套使用,要么與throws配套使用。

            
              //
            
            
              使用throws拋出異常
            
            
              public
            
            
              void
            
             f() 
            
              throws
            
            
               MyException{
         
            
            
              try
            
            
               {
            FileReader reader 
            
            = 
            
              new
            
             FileReader("G:\\myfile\\struts.txt"
            
              );  
             Scanner in 
            
            = 
            
              new
            
            
               Scanner(reader);  
             System.out.println(in.next());
        } 
            
            
              catch
            
            
               (FileNotFoundException e) {
            
            
            
              throw
            
            
              new
            
             MyException("文件沒有找到", e);    
            
              //
            
            
              throw
            
            
                      }  
        
    }
            
          

?

?

?

九、總結(jié)

????? 其實(shí)對(duì)于異常使用的優(yōu)缺點(diǎn)現(xiàn)在確實(shí)存在很多的討論。例如: http://www.cnblogs.com/mailingfeng/archive/2012/11/14/2769974.html 。這篇博文對(duì)于是否需要使用異常進(jìn)行了比較深刻的討論。LZ實(shí)乃菜鳥一枚,不能理解異常深?yuàn)W之處。但是有一點(diǎn)LZ可以肯定,那就是異常必定會(huì)影響系統(tǒng)的性能。

????? 異常使用指南(摘自:Think in java)

????? 應(yīng)該在下列情況下使用異常。

????? 1、在恰當(dāng)?shù)募?jí)別處理問題(在知道該如何處理異常的情況下才捕獲異常)。

????? 2、解決問題并且重新調(diào)用產(chǎn)生異常的方法。

????? 3、進(jìn)行少許修補(bǔ),然后繞過異常發(fā)生的地方繼續(xù)執(zhí)行。

????? 4、用別的數(shù)據(jù)進(jìn)行計(jì)算,以代替方法預(yù)計(jì)會(huì)返回的值。

????? 5、把當(dāng)前運(yùn)行環(huán)境下能做的事情盡量做完。然后把相同(不同)的異常重新拋到更高層。

????? 6、終止程序。

????? 7、進(jìn)行簡化。

????? 8、讓類庫和程序更加安全。(這既是在為調(diào)試做短期投資,也是在為程序的健壯做長期投資)

java提高篇-----異常


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 久久青草免费线观最新 | 中文字幕最新在线 | 免费爽视频 | 国产精品高清一区二区不卡 | 久久亚洲精品国产亚洲老地址 | 天天干天天拍天天射天天添天天爱 | 色综合中文 | 国产成人亚洲综合一区 | 日本福利片国产午夜久久 | 国产免费爱在线观看视频 | 香蕉黄色网 | 亚洲国产欧美自拍 | 国产性较精品视频免费 | 欧美大片国产在线永久播放 | 日本一级成人毛片免费观看 | 国产精品1000部在线观看 | 亚洲综合区 | 国产精品高清久久久久久久 | 九九精品视频一区在线 | 九九热免费| 四虎视频国产精品免费入口 | 99精品久久久久久久婷婷 | 日本特黄一级午夜剧场毛片 | 日韩在线免费视频观看 | 日韩国产在线 | 精品免费久久久久久久 | 99r在线| 欧美乱一级在线观看 | 69做爰视频在线观看 | 99免费视频观看 | 草草在线观看 | a级爱爱视频 | 国产 福利 在线 | 国产a不卡片精品免费观看 国产a高清 | 久久啊 | 国产区成人综合色在线 | 添bbb免费观看高清视频 | 性ao爱大片 | 国产一区二区在线不卡 | 热久久免费视频 | 在线成人国产 |