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

深入分析Java異常

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

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

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

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

常見(jiàn)異常類

列舉幾個(gè)常見(jiàn)的運(yùn)行時(shí)異常RuntimeException:

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

列舉幾個(gè)非運(yùn)行時(shí)異常(Checked異常):

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

Error錯(cuò)誤

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

Checked異常的使用

前面提到了Checked必須顯式的處理,不然編譯報(bào)錯(cuò),比如聲明一個(gè)文件輸入流:

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

這段代碼編譯會(huì)報(bào)錯(cuò)

Unhandled exception type FileNotFoundException

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

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

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

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

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

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

使用throw自行拋出異常

有的時(shí)候根據(jù)業(yè)務(wù)需要,我們?cè)诔绦蚶锩鏁?huì)自行拋出異常,比如如果讀取的文件內(nèi)容為空,我們就認(rèn)為這是一個(gè)異常,這時(shí)候我們可以使用throw來(lái)主動(dòng)拋出異常,并且用catch捕獲它:

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

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

異常鏈處理

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

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

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

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

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

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

這種把捕獲一個(gè)異常然后拋出另一個(gè)異常,并把原始異常信息保存下來(lái),是一種典型的鏈?zhǔn)教幚?,在設(shè)計(jì)模式中被稱為責(zé)任鏈模式。

使用異常的幾個(gè)建議

我們使用異常是為了實(shí)現(xiàn)幾個(gè)目標(biāo):

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

針對(duì)這些目標(biāo),我們應(yīng)該做到:

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

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

相關(guān)文章

  • java calendar 日期實(shí)現(xiàn)不斷加一天的代碼

    java calendar 日期實(shí)現(xiàn)不斷加一天的代碼

    這篇文章主要介紹了java calendar 日期實(shí)現(xiàn)不斷加一天的代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-10-10
  • 微信小程序之搜索分頁(yè)功能的實(shí)現(xiàn)代碼

    微信小程序之搜索分頁(yè)功能的實(shí)現(xiàn)代碼

    這篇文章主要介紹了微信小程序之搜索分頁(yè)功能的實(shí)現(xiàn)代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Netty粘包問(wèn)題的常見(jiàn)解決方案

    Netty粘包問(wèn)題的常見(jiàn)解決方案

    粘包和拆包問(wèn)題也叫做粘包和半包問(wèn)題,它是指在數(shù)據(jù)傳輸時(shí),接收方未能正常讀取到一條完整數(shù)據(jù)的情況(只讀取了部分?jǐn)?shù)據(jù),或多讀取到了另一條數(shù)據(jù)的情況)就叫做粘包或拆包問(wèn)題,本文介紹了Netty如何解決粘包問(wèn)題,需要的朋友可以參考下
    2024-06-06
  • tdesign的文件上傳功能實(shí)現(xiàn)(微信小程序+idea的springboot)

    tdesign的文件上傳功能實(shí)現(xiàn)(微信小程序+idea的springboot)

    這篇文章主要介紹了tdesign的文件上傳(微信小程序+idea的springboot)的相關(guān)知識(shí),本文通過(guò)圖文實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2023-09-09
  • 詳解spring mvc中url-pattern的寫(xiě)法

    詳解spring mvc中url-pattern的寫(xiě)法

    這篇文章主要介紹了spring mvc中url-pattern的寫(xiě)法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • Java終止循環(huán)體的具體實(shí)現(xiàn)

    Java終止循環(huán)體的具體實(shí)現(xiàn)

    這篇文章主要介紹了Java終止循環(huán)體的具體實(shí)現(xiàn),需要的朋友可以參考下
    2014-02-02
  • IDEA創(chuàng)建MyBatis配置文件模板的方法步驟

    IDEA創(chuàng)建MyBatis配置文件模板的方法步驟

    這篇文章主要介紹了IDEA創(chuàng)建MyBatis配置文件模板的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Java API方式調(diào)用Kafka各種協(xié)議的方法

    Java API方式調(diào)用Kafka各種協(xié)議的方法

    本篇文章主要介紹了Java API方式調(diào)用Kafka各種協(xié)議的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • IDEA 中使用 Big Data Tools 連接大數(shù)據(jù)組件

    IDEA 中使用 Big Data Tools 連接大數(shù)據(jù)組件

    本文主要介紹了IDEA 中使用 Big Data Tools 連接大數(shù)據(jù)組件,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • java開(kāi)發(fā)Dubbo注解Adaptive實(shí)現(xiàn)原理

    java開(kāi)發(fā)Dubbo注解Adaptive實(shí)現(xiàn)原理

    這篇文章主要為大家介紹了java開(kāi)發(fā)Dubbo注解Adaptive實(shí)現(xiàn)原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09

最新評(píng)論