最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java異常處理的12條軍規(guī)總結

 更新時間:2019年04月08日 09:25:55   作者:張濤tom  
這篇文章主要給大家介紹了關于Java異常處理的12條軍規(guī),文中通過示例代碼介紹的非常詳細,對大家學習或者使用Java具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧

異常的概念

異常是程序中的一些錯誤,但并不是所有的錯誤都是異常,并且錯誤有時候是可以避免的。

比如說,你的代碼少了一個分號,那么運行出來結果是提示是錯誤java.lang.Error;如果你用System.out.println(11/0),那么你是因為你用0做了除數(shù),會拋出java.lang.ArithmeticException的異常。

異常發(fā)生的原因有很多,通常包含以下幾大類:

•用戶輸入了非法數(shù)據(jù)。

•要打開的文件不存在。

•網(wǎng)絡通信時連接中斷,或者JVM內存溢出。

這些異常有的是因為用戶錯誤引起,有的是程序錯誤引起的,還有其它一些是因為物理錯誤引起的。-

在Java語言中,異常從使用方式上可以分為兩大類:

  • CheckedException
  • UncheckedException

在Java中類的異常結構圖如下:

  1. 可檢查異常需要在方法上聲明,一般要求調用者必須感知異??赡馨l(fā)生,并且對可能發(fā)生的異常進行處理??梢岳斫獬上到y(tǒng)正常狀態(tài)下很可能發(fā)生的情況,通常發(fā)生在通過網(wǎng)絡調用外部系統(tǒng)或者使用文件系統(tǒng)時,在這種情況下,錯誤是可能恢復的,調用者可以根據(jù)異常做出必要的處理,例如重試或者資源清理等。
  2. 非檢查異常是不需要在throws子句中聲明的異常。JVM根本不會強制您處理它們,因為它們主要是由于程序錯誤而在運行時生成的。它們擴展了RuntimeException。最常見的例子是NullPointerException 可能不應該重試未經(jīng)檢查的異常,并且正確的操作通常應該是什么都不做,并讓它從您的方法和執(zhí)行堆棧中出來。在高執(zhí)行級別,應記錄此類異常。
  3. Error是最為嚴重的運行時錯誤,幾乎是不可能恢復和處理,一些示例是OutOfMemoryError,LinkageError和StackOverflowError。它們通常會使程序或程序的一部分崩潰。只有良好的日志記錄練習才能幫助您確定錯誤的確切原因.

在異常處理時的幾點建議:

1永遠不要catch中吞掉異常,否則在系統(tǒng)發(fā)生錯誤時,你永遠不知道到底發(fā)生了什么

catch (SomeException e) {
 return null;
}

2盡量使用特定的異常而不是一律使用Exception這樣太泛泛的異常

public void foo() throws Exception { //錯誤的做法}
public void foo() throws MyBusinessException1, MyBusinessException2 { //正確的做法}

        一味的使用Exception,這樣就違背了可檢查異常的設計初衷,因為調用都不知道Exception到底是什么,也不知道該如何處理。捕獲異常時,也不要捕獲范圍太大,例如捕獲Exception,相反,只捕獲你能處理的異常,應該處理的異常。即然方法的聲明者在方法上聲明了不同類型的可檢查異常,他是希望調用者區(qū)別對待不同異常的。

3Never catch Throwable class

    永遠不要捕獲Throwable,因為Error也是繼承自它,Error是Jvm都處理不了的錯誤,你能處理?所以基于有些Jvm在Error時就不會讓你catch住。

4正確的封裝和傳遞異常

不要丟失異常棧,因為異常棧對于定位原始錯誤很關鍵

catch (SomeException e) {
throw new MyServiceException("Some information: " + e.getMessage()); //錯誤的做法
}

一定要保留原始的異常:

catch (SomeException e) {
  throw new MyServiceException("Some information: " , e); //正確的打開方式
}

5要打印異常,就不要拋出,不要兩者都做

catch (SomeException e) {
  LOGGER.error("Some information", e);
throw e;
}

這樣的log沒有任何意義,只會打印出一連串的error log,對于定位問題無濟于事。

6不要在finally塊中拋出異常

如果在finally中拋出異常,將會覆蓋原始的異常,如果finally中真的可能會發(fā)生異常,那一定要處理并記錄它,不要向上拋。

7不要使用printStackTrace

要給異常添加上有用的上下文信息,單純的異常棧,沒有太大意義

8Throw early catch late

異常界著名的原則,錯誤發(fā)生時及早拋出,然后在獲得所以全部信息時再捕獲處理.也可以理解為在低層次拋出的異常,在足夠高的抽象層面才能更好的理解異常,然后捕獲處理。

9對于使用一些重量級資源的操作,發(fā)生異常時,一定記得清理

如網(wǎng)絡連接,數(shù)據(jù)庫操作等,可以用try finally來做clean up的工作。

10不要使用異常來控制程序邏輯流程

我們總是不經(jīng)意間這么做了,這樣使得代碼變更丑陋,使得正常業(yè)務邏輯和錯誤處理混淆不清;而且也可能會帶來性能問題,因為異常是個比較重的操作。

11及早校驗用戶的輸入

在最邊緣的入口校驗用戶的輸入,這樣使得我們不用再更底層邏輯中處處校驗參數(shù)的合法性,能大大簡化業(yè)務邏輯中不必要的異常處理邏輯;相反,在業(yè)務中不如果擔心參數(shù)的合法性,則應該使用衛(wèi)語句拋出運行時異常,一步步把對參數(shù)錯誤的處理推到系統(tǒng)的邊緣,保持系統(tǒng)內部的清潔。

12在打印錯誤的log中盡量在一行中包含盡可能多的上下文

LOGGER.debug("enter A");
LOGGER.debug("enter B"); //錯誤的方式
LOGGER.debug("enter A, enter B");//正確的方式

Thanks all. Happy Learning!!

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。

相關文章

  • 簡單了解JAVA變量類型及代碼實例

    簡單了解JAVA變量類型及代碼實例

    這篇文章主要介紹了簡單了解JAVA變量類型及代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • java web驗證碼實現(xiàn)代碼分享

    java web驗證碼實現(xiàn)代碼分享

    這篇文章主要為大家分享了java web驗證碼的實現(xiàn)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-06-06
  • java線程阻塞中斷與LockSupport使用介紹

    java線程阻塞中斷與LockSupport使用介紹

    本文將詳細介紹java線程阻塞中斷和LockSupport的使用,需要了解更多的朋友可以參考下
    2012-12-12
  • Java 文件上傳的實例詳解

    Java 文件上傳的實例詳解

    這篇文章主要介紹了Java 文件上傳的實例詳解的相關資料,希望通過本文大家能掌握這部分內容,使用幾種文件上傳的方法,需要的朋友可以參考下
    2017-09-09
  • Springboot的自動配置是什么及注意事項

    Springboot的自動配置是什么及注意事項

    SpringBoot的自動配置(Auto-configuration)是指框架根據(jù)項目的依賴和應用程序的環(huán)境自動配置Spring應用上下文中的Bean和組件,目的是簡化開發(fā)者的配置工作,本文介紹Springboot的自動配置是什么及注意事項,感興趣的朋友一起看看吧
    2025-03-03
  • springboot CompletableFuture并行計算及使用方法

    springboot CompletableFuture并行計算及使用方法

    CompletableFuture基于 Future 和 CompletionStage 接口,利用線程池、回調函數(shù)、異常處理、組合操作等機制,提供了強大而靈活的異步編程功能,這篇文章主要介紹了springboot CompletableFuture并行計算及使用方法,需要的朋友可以參考下
    2024-05-05
  • Spring源碼BeanFactoryPostProcessor詳解

    Spring源碼BeanFactoryPostProcessor詳解

    BeanFactoryPostProcessor的執(zhí)行時機是在Spring掃描完成后,Bean初始化前,當我們實現(xiàn)BeanFactoryPostProcessor接口,可以在Bean的初始化之前對Bean進行屬性的修改,下面通過本文看下Spring源碼分析-BeanFactoryPostProcessor的實例代碼,感興趣的朋友一起看看吧
    2021-11-11
  • JAVA生成xml文件簡單示例

    JAVA生成xml文件簡單示例

    這篇文章主要介紹了JAVA生成xml文件的相關資料,在Java中可以使用DOM或者JDOM來生成XML文件,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-07-07
  • 解讀什么是構造方法?能否被重寫或重載?

    解讀什么是構造方法?能否被重寫或重載?

    這篇文章主要介紹了什么是構造方法?能否被重寫或重載問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • Springboot 如何使用 SaToken 進行登錄認證、權限管理及路由規(guī)則接口攔截

    Springboot 如何使用 SaToken 進行登錄認證、權限管理及路由規(guī)則接口攔截

    Sa-Token 是一個輕量級 Java 權限認證框架,主要解決:登錄認證、權限認證、單點登錄、OAuth2.0、分布式Session會話、微服務網(wǎng)關鑒權 等一系列權限相關問題,這篇文章主要介紹了Springboot 使用 SaToken 進行登錄認證、權限管理以及路由規(guī)則接口攔截,需要的朋友可以參考下
    2024-06-06

最新評論

留坝县| 郁南县| 峡江县| 乌苏市| 汾阳市| 滦平县| 麟游县| 鹤庆县| 曲水县| 新安县| 宜兰县| 成都市| 凤翔县| 襄城县| 佛冈县| 锡林郭勒盟| 积石山| 丰城市| 湖北省| 清远市| 定边县| 广南县| 公安县| 永城市| 淮北市| 沂源县| 马尔康县| 磐石市| 泰兴市| 济南市| 黎城县| 旌德县| 曲沃县| 康保县| 河源市| 六安市| 石泉县| 康平县| 神木县| 孝昌县| 霍林郭勒市|