日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java异常处理原则与技巧总结

發(fā)布時間:2023/12/10 java 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java异常处理原则与技巧总结 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

  一??處理原則

  Java異常代碼中我們使用異常的目的是讓異常的異常類型來提示“什么”被拋出了--- 即出了什么問題;用異常的棧打印信息來跟蹤異常在“哪里”拋出 --- 即哪里出了問題;

  異常提示信息來提示“為什么”會拋出 --- 即出問題的原因。在對異常進行處理時,遵循以下原則可以有助于在調(diào)試過程中最大限度的使用好異常。

  • 具體明確
  • 提早拋出
  • 延遲捕獲
  •   1.具體明確

      具體明確指的是在拋出異常時需要針對具體問題來拋出異常,拋出的異常要足夠具體詳細;在捕獲異常時需要對捕獲的異常進行細分,這時會有多個catch語句塊,這幾個catch塊中間泛化程度越低的異常需要越放在

      前面捕獲,泛化程度高的異常捕獲放在后面,這樣的好處是如果出現(xiàn)異常可以近可能得明確異常的具體類型是什么。

      例如 FileInputStream 的一個構(gòu)造方法如下, 對file對象做檢查后判斷file是否有效,如果無效直接拋出FileNotFoundException,而不是IOException或者其他更寬泛的Exception

    public FileInputStream(File file) throws FileNotFoundException {String name = (file != null ? file.getPath() : null);SecurityManager security = System.getSecurityManager();if (security != null) {security.checkRead(name);}if (name == null) {throw new NullPointerException();}if (file.isInvalid()) {throw new FileNotFoundException("Invalid file path");}fd = new FileDescriptor();fd.attach(this);path = name;open(name);}

      同樣的,在對異常做捕獲處理時,也需要做到具體明確,以下try語句塊中read()和close方法均會拋出IOException而FileInputStream()拋出的是FileNotFoundException

      事實上FileNotFoundException繼承自IOException,用一個IOException 就可以囊括所有的異常,這里仍然使用了兩個catch塊來分別捕獲,為的就是方便定位異常問題。

    public void foo1(String fileName){File file = new File(fileName);InputStream in = null;try {in = new FileInputStream(file);Integer num = in.read();in.close();} catch (FileNotFoundException e) {e.printStackTrace();}catch (IOException e){e.printStackTrace();}}

    ?

      2.提早拋出

      提早拋出的基本目的還是為了防止問題擴散,這樣出現(xiàn)異常的話排查起來會比較耗時,比較典型的一種情況是 NPE(NullPointerException),當某個參數(shù)對象為null時,如果不提早判斷并拋出異常的話,這個null可能

      會藏的比較深,等到出現(xiàn)NPE時就需要往回追溯代碼了。這樣就給排查問題增加了難度。所以我們的處理原則是出現(xiàn)問題就及早拋出異常。

      例如 上面FileInputStream 的構(gòu)造方法,在使用前就對File 的path做了判斷,如果為null 就及早的拋出NullPointerException,防止在后面open方法中傳入一個null,從而簡化了出現(xiàn)異常的情況,方便定位問題。

    ?

      3.延遲捕獲

      延遲捕獲說的是對異常的捕獲和處理需要根據(jù)當前代碼的能力來做,如果當前方法內(nèi)無法對異常做處理,即使出現(xiàn)了檢查異常也應(yīng)該考慮將異常拋出給調(diào)用者做處理,如果調(diào)用者也無法處理理論上他也應(yīng)該繼續(xù)上拋,

      這樣異常最終會在一個適當?shù)奈恢帽籧atch下來,而比起異常出現(xiàn)的位置,異常的捕獲和處理是延遲了很多。但是也避免了不恰當?shù)奶幚怼?/p>

    ?

      二??處理技巧

      對于異常的處理,能避免的異常,盡量在事先做判斷來避免異常的發(fā)生,當判斷時發(fā)現(xiàn)邏輯上已經(jīng)不能往下走了,需要停止流程,這時候?qū)惓伋霾蚀_的提示使用者問題所在。

      對于事先無法預(yù)判的異常需要對其進行處理。

      異常分運行時異常 RuntimeException 和 檢查異常Checked Exception,運行時異常一般用在由于接口方法使用不當?shù)臅r候

      如: 使用了null獲取屬性方法, 數(shù)組下標越界,除法運算除以0等

    • 如果你調(diào)用服務(wù)方法的方式不正確,你應(yīng)該馬上修改代碼,避免發(fā)生RuntimeException
    • 如果是用戶方法調(diào)用你的方法的方式不正確,你應(yīng)該立刻拋出RuntimeException,強制讓使用者修正代碼或改變使用方式,防止問題蔓延
    • 一般情況下,不要捕獲或聲明RuntimeException,需要做的是完善程序代碼。因為問題在于你的程序本身有問題,如果你用異常流程處理了,反而讓正常流程問題一直存在

    ?

      對于檢查異常,一般先看能不能處理,能處理的異常使用try-catch 語句塊捕獲處理,不能處理使用throws 分類型拋出給上一級處理

      使用try-catch語句塊處理時一般需要注意以下幾方面

  • try語句塊內(nèi)要分清穩(wěn)定代碼和非穩(wěn)定代碼,對于穩(wěn)定的不會出現(xiàn)異常的代碼不要放到try語句塊中
  • catch捕獲的異常一定要處理
  • 若使用了finally 語句塊,在語句塊內(nèi)一定要對資源對象,流對象進行關(guān)閉(jdk1.7之后 可以使用try-with-resources替代)
  • finally中不要使用return語句,因為finally語句塊最后一定會執(zhí)行,這里的return語句會覆蓋之前的return語句
  • ?

      參考:

      [1]?有效處理javay異常的三個原則

      [2] 阿里巴巴Java開發(fā)手冊

    ?

    轉(zhuǎn)載于:https://www.cnblogs.com/mingorun/p/8900449.html

    總結(jié)

    以上是生活随笔為你收集整理的Java异常处理原则与技巧总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。