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

深入分析Java異常

 更新時間:2018年05月20日 15:28:38   作者:scu醬油仔  
本篇文章給大家詳細分享了關(guān)于Java異常的相關(guān)知識點,對此有需要的朋友跟著學習下吧。

java異常分為兩大類,Checked異常和Runtime異常,Checked異常都是在編譯階段可以被處理的異常。

Checked異常和Runtime異常的區(qū)別和聯(lián)系

  • Checked異常都是可以被處理的異常,在程序中必須顯式地處理Checked異常,如果沒有處理,那么編譯就會報錯。而Runtime異??梢圆槐伙@式的處理;
  • 都是Exception的子類,繼承了RuntimeException的就是Runtime異常,其他的就是Checked異常。

常見異常類

列舉幾個常見的運行時異常RuntimeException:

  • IndexOutOfBoundException:數(shù)組越界異常;
  • NullPointerException:空指針異常;
  • ClassCastException:類轉(zhuǎn)換異常;
  • NumberFormatException:數(shù)字格式異常;
  • ArithmeticException:運算異常。

列舉幾個非運行時異常(Checked異常):

  • SQLException:SQL異常;
  • IOException:IO異常;
  • FileNotFoundException:文件找不到異常,是IOException的子類;
  • InterruptedException:中斷異常,一般用在多線程編程;
  • ClassNotFoundException:類找不到。

Error錯誤

Error錯誤一般指與虛擬機相關(guān)的問題,如系統(tǒng)崩潰,虛擬機錯誤,動態(tài)鏈接失敗等,這種錯誤無法恢復或不可被捕獲,將導致應(yīng)用程序中斷。通常應(yīng)用程序也無法處理這些錯誤,因此程序中不應(yīng)該試圖使用catch來捕獲Error對象。在方法定義時,也無需throws Error對象。

Checked異常的使用

前面提到了Checked必須顯式的處理,不然編譯報錯,比如聲明一個文件輸入流:

FileInputStream fis = new FileInputStream("test.md");

這段代碼編譯會報錯

Unhandled exception type FileNotFoundException

因此必須顯式的處理它,處理Checked異常的方式一般有兩種:

如果知道如何處理,那么最好使用try…catch...塊處理:

//Checked異常必須被顯式處理
try {
 FileInputStream fis = new FileInputStream("test.md");
} catch (FileNotFoundException e) {
 e.printStackTrace();
 System.out.println("文件不存在!");
}

如果不知道如何處理,那么就在方法中拋出,由上一級調(diào)用者處理:

public static void main(String[] args) throws FileNotFoundException {

 //Checked異常必須被顯式處理
 //在main方法中拋出異常,交給JVM處理,JVM對異常的處理辦法就是打印跟蹤棧信息,并終止程序運行
 FileInputStream fis = new FileInputStream("test.md");
}

使用throw自行拋出異常

有的時候根據(jù)業(yè)務(wù)需要,我們在程序里面會自行拋出異常,比如如果讀取的文件內(nèi)容為空,我們就認為這是一個異常,這時候我們可以使用throw來主動拋出異常,并且用catch捕獲它:

//使用throw主動拋出異常
try {
 FileInputStream fis = new FileInputStream("test.md");
 if(fis.read() == 0) {
  throw new IOException("空文件");
 }
} catch (IOException e) {
 e.printStackTrace();
}

如果throw拋出的是一個runtime異常,那么程序可以用try…catch…捕獲,也可以不用理會。

異常鏈處理

在真實的企業(yè)級應(yīng)用中,我們往往不會講底層的異常暴露給上層應(yīng)用,比如不會把SQL異常暴露到用戶界面上。一是對于用戶而言,看到SQL異常對他們也沒啥幫助,二是對于惡意用戶而言,暴露底層異常不安全。

那么如何屏蔽底層異常呢?通常的做法是:程序先捕獲原始異常,然后拋出一個新的業(yè)務(wù)異常,新的業(yè)務(wù)異常包含了對用戶的提示信息,這種處理方式成為異常轉(zhuǎn)譯。下面演示一個創(chuàng)建用戶的程序如何屏蔽底層異常:

//演示異常鏈,創(chuàng)建用戶
public void createSubscriber(int subId) throws BusinessException {
 try {
  //創(chuàng)建用戶的邏輯......

 }catch(Exception e){
  //處理并保存原始異常...

  //拋出新的業(yè)務(wù)異常
  throw new BusinessException("用戶創(chuàng)建失敗");
 }
}

可以看到程序把原始異常隱藏起來,僅向上提供必要的異常提示信息,可以保證底層異常不會擴展到表現(xiàn)層,這完全符合對象的封裝原則。

這種把捕獲一個異常然后拋出另一個異常,并把原始異常信息保存下來,是一種典型的鏈式處理,在設(shè)計模式中被稱為責任鏈模式。

使用異常的幾個建議

我們使用異常是為了實現(xiàn)幾個目標:

  • 使程序代碼混亂最小化;
  • 捕獲并保留診斷信息;
  • 通知合適的人員;
  • 采用合適的方式結(jié)束異常活動

針對這些目標,我們應(yīng)該做到:

1、不要過度使用和依賴它:異常很方便,但是不要把正常的邏輯處理都使用異常處理,比如

//原始代碼
if(fileSize > 100){
 Sysotem.out.println("文件過大,請重新上傳");
 continue;
}
//改成使用異常 
if(fileSize > 100){
 throw new Exception("文件過大,請重新上傳");
}
//這樣做,很明顯不負責任。
  1. 不要在try里面寫很多代碼:這樣可能增加異常分析的難度,并且大量的代碼可能需要大量的catch來捕獲不同的異常;
  2. 避免使用catch來捕獲所有類型的異常:比如catch(Throwable t)或者catch(Exception e)這樣,對所有異常使用同樣的邏輯處理,不得不寫很多if語句處理不同情況,得不償失,并且這種捕獲方式可能將Error、Runtime等可能導致程序終止的異常捕獲,從而“壓制”了異常,一些關(guān)鍵異??赡鼙磺那暮雎裕?/li>
  3. 不要忽略捕獲到的異常:catch應(yīng)該做一些有用的事情,不要為空或者只打印異常,catch塊為空就是瞞天過海,程序出了錯誤,所有人看不到任何異常,但是程序可能已經(jīng)壞了!在捕獲到異常的時候,要么處理它,要么拋出新異常,要么向上拋出并在合適的地方處理異常。

相關(guān)文章

  • 使用Java將一個List運用遞歸轉(zhuǎn)成樹形結(jié)構(gòu)案例

    使用Java將一個List運用遞歸轉(zhuǎn)成樹形結(jié)構(gòu)案例

    這篇文章主要介紹了使用Java將一個List運用遞歸轉(zhuǎn)成樹形結(jié)構(gòu)案例,本文通過詳細的案例來解釋說明了如何去操作,需要的朋友可以參考下
    2021-06-06
  • idea安裝hsdis的方法

    idea安裝hsdis的方法

    這篇文章主要介紹了idea安裝hsdis,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • SpringBoot3 Spring WebFlux簡介(推薦)

    SpringBoot3 Spring WebFlux簡介(推薦)

    SpringWebFlux是Spring Framework 5中引入的響應(yīng)式Web框架,用于支持非阻塞異步通信和響應(yīng)式流處理,與傳統(tǒng)的SpringMVC相比,WebFlux提供了完全異步非阻塞的編程模型,適用高并發(fā)、微服務(wù)架構(gòu)和實時數(shù)據(jù)流,本文介紹SpringBoot3 Spring WebFlux簡介,感興趣的朋友一起看看吧
    2024-10-10
  • springboot war包部署過程詳解

    springboot war包部署過程詳解

    這篇文章主要為大家介紹了springboot war包部署過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • 多模塊項目使用枚舉配置spring-cache緩存方案詳解

    多模塊項目使用枚舉配置spring-cache緩存方案詳解

    這篇文章主要為大家介紹了多模塊項目使用枚舉配置spring-cache緩存的方案詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • SpringBoot3快速整合MyBatisPlus的示例代碼

    SpringBoot3快速整合MyBatisPlus的示例代碼

    本文介紹了快速整合MyBatis-Plus到Spring Boot 3項目中,包括依賴引入、代碼生成器使用等,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-12-12
  • 盤點幾種常見的java排序算法

    盤點幾種常見的java排序算法

    所謂排序就是使一串記錄,按照其中的某個或某些關(guān)鍵字的大小,遞增或遞減的排列起來的操作,下面這篇文章主要給大家介紹了幾種常見的java排序算法的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • Feign調(diào)用接口解決處理內(nèi)部異常的問題

    Feign調(diào)用接口解決處理內(nèi)部異常的問題

    這篇文章主要介紹了Feign調(diào)用接口解決處理內(nèi)部異常的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 使用java實現(xiàn)備份和恢復SQLServer表數(shù)據(jù)

    使用java實現(xiàn)備份和恢復SQLServer表數(shù)據(jù)

    這篇文章主要為大家詳細介紹了如何使用java實現(xiàn)備份和恢復SQLServer表數(shù)據(jù),文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-01-01
  • Spring事務(wù)處理Transactional,鎖同步和并發(fā)線程

    Spring事務(wù)處理Transactional,鎖同步和并發(fā)線程

    本文詳細講解了Spring事務(wù)處理Transactional,鎖同步和并發(fā)線程。對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-12-12

最新評論

景德镇市| 孟村| 泰和县| 酉阳| 治多县| 千阳县| 吉水县| 阿拉尔市| 呈贡县| 临城县| 松溪县| 宜城市| 台江县| 河东区| 将乐县| 长乐市| 婺源县| 綦江县| 醴陵市| 隆德县| 民乐县| 孝义市| 方正县| 南雄市| 同德县| 福泉市| 攀枝花市| 马边| 台南县| 天气| 呼和浩特市| 固镇县| 安化县| 葫芦岛市| 武邑县| 仁寿县| 特克斯县| 宣汉县| 宝丰县| 镇江市| 名山县|