亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

異常的概念

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

比如說,你的代碼少了一個(gè)分號(hào),那么運(yùn)行出來結(jié)果是提示是錯(cuò)誤java.lang.Error;如果你用System.out.println(11/0),那么你是因?yàn)槟阌?做了除數(shù),會(huì)拋出java.lang.ArithmeticException的異常。

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

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

•要打開的文件不存在。

•網(wǎng)絡(luò)通信時(shí)連接中斷,或者JVM內(nèi)存溢出。

這些異常有的是因?yàn)橛脩翦e(cuò)誤引起,有的是程序錯(cuò)誤引起的,還有其它一些是因?yàn)槲锢礤e(cuò)誤引起的。-

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

  • CheckedException
  • UncheckedException

在Java中類的異常結(jié)構(gòu)圖如下:

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

在異常處理時(shí)的幾點(diǎn)建議:

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

catch (SomeException e) {
 return null;
}

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

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

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

3Never catch Throwable class

    永遠(yuǎn)不要捕獲Throwable,因?yàn)镋rror也是繼承自它,Error是Jvm都處理不了的錯(cuò)誤,你能處理?所以基于有些Jvm在Error時(shí)就不會(huì)讓你catch住。

4正確的封裝和傳遞異常

不要丟失異常棧,因?yàn)楫惓?duì)于定位原始錯(cuò)誤很關(guān)鍵

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

一定要保留原始的異常:

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

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

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

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

6不要在finally塊中拋出異常

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

7不要使用printStackTrace

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

8Throw early catch late

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

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

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

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

我們總是不經(jīng)意間這么做了,這樣使得代碼變更丑陋,使得正常業(yè)務(wù)邏輯和錯(cuò)誤處理混淆不清;而且也可能會(huì)帶來性能問題,因?yàn)楫惓J莻€(gè)比較重的操作。

11及早校驗(yàn)用戶的輸入

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

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

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

Thanks all. Happy Learning!!

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • idea無法切換分支報(bào)錯(cuò)問題及解決

    idea無法切換分支報(bào)錯(cuò)問題及解決

    這篇文章主要介紹了idea無法切換分支報(bào)錯(cuò)問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • springboot配置https訪問的方法

    springboot配置https訪問的方法

    這篇文章主要介紹了springboot配置https訪問的方法,需要的朋友可以參考下
    2018-11-11
  • SpringBoot項(xiàng)目網(wǎng)頁加載出現(xiàn)Whitelabel?Error?Page的解決

    SpringBoot項(xiàng)目網(wǎng)頁加載出現(xiàn)Whitelabel?Error?Page的解決

    這篇文章主要介紹了SpringBoot項(xiàng)目網(wǎng)頁加載出現(xiàn)Whitelabel?Error?Page的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Java中如何編寫一個(gè)數(shù)的n次方(冪運(yùn)算)?

    Java中如何編寫一個(gè)數(shù)的n次方(冪運(yùn)算)?

    本文介紹了使用pow函數(shù)和自定義for循環(huán)計(jì)算冪的O(n)時(shí)間復(fù)雜度方法,然后重點(diǎn)講解了快速冪算法的分治思想,以及從二進(jìn)制角度的解釋,包括如何通過位運(yùn)算和循環(huán)迭代實(shí)現(xiàn)高效計(jì)算,給出了Java代碼實(shí)現(xiàn)
    2024-07-07
  • SpringBoot實(shí)現(xiàn)單文件與多文件上傳

    SpringBoot實(shí)現(xiàn)單文件與多文件上傳

    本次例子不基于第三方存儲(chǔ)(如七牛云對(duì)象存儲(chǔ)、阿里云對(duì)象存儲(chǔ)、騰訊云對(duì)象存儲(chǔ)等),僅基于本地存儲(chǔ)。本文主要內(nèi)容如下:公共文件存儲(chǔ)代碼;單文件上傳代碼;多文件上傳代碼
    2021-05-05
  • 解決IDEA顯示非法字符 \ufeff 的問題

    解決IDEA顯示非法字符 \ufeff 的問題

    這篇文章主要介紹了解決IDEA顯示非法字符 \ufeff 的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • Java中的WeakHashMap詳解

    Java中的WeakHashMap詳解

    這篇文章主要介紹了Java中的WeakHashMap詳解,WeakHashMap可能平時(shí)使用的頻率并不高,但是你可能聽過WeakHashMap會(huì)進(jìn)行自動(dòng)回收吧,下面就對(duì)其原理進(jìn)行分析,需要的朋友可以參考下
    2023-09-09
  • Springboot注入成員變量HttpServletRequest的原理分析

    Springboot注入成員變量HttpServletRequest的原理分析

    這篇文章主要介紹了Springboot注入成員變量HttpServletRequest的原理分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Java私有構(gòu)造函數(shù)作用原理解析

    Java私有構(gòu)造函數(shù)作用原理解析

    這篇文章主要介紹了Java私有構(gòu)造函數(shù)作用原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • 基于java Files類和Paths類的用法(詳解)

    基于java Files類和Paths類的用法(詳解)

    下面小編就為大家分享一篇基于java Files類和Paths類的用法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2017-11-11

最新評(píng)論