国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Java 常見異常種類

ethernet / 955人閱讀

摘要:在中,異常被當(dāng)做對象來處理,其基類是。又分為檢查異常和運(yùn)行時(shí)異常。但在子類中,只有三類異常類提供了帶參數(shù)的構(gòu)造器,其它類型的異常則需要通過方法。在程序的邊界進(jìn)行異常捕獲。只針對異常的情況才使用異常。

1、什么是異常

結(jié)構(gòu)不佳的代碼不能運(yùn)行,這是Java的基本理念。

發(fā)現(xiàn)錯誤的理想時(shí)機(jī)是在編譯期。然而,編譯器并不能發(fā)現(xiàn)所有的錯誤,余下的問題就需要在程序運(yùn)行時(shí)解決。這就需要錯誤能通過某種方式,把適當(dāng)?shù)男畔?傳遞給特定的接收者處理。Java中的異常處理的目的在于通過使用少量的代碼來簡化大型、可靠的程序的生成,通過此方式讓你的應(yīng)用中沒有未處理的錯誤,而 且它還帶來了一個(gè)明顯的好處:降低錯誤處理代碼的復(fù)雜度。

異常,根據(jù)字面理解,有意外之意。把它置于代碼層面來理解,即阻止了當(dāng)前方法或作用域繼續(xù)執(zhí)行。

在Java中,異常被當(dāng)做對象來處理,其基類是Throwable。

2、Java中的異常類型

Java從Throwable直接派生出Exception和Error。其中Exception是可以拋出的基本類型,在Java類庫、方法以及運(yùn)行時(shí)故障中都可能拋出Exception型異常。Exception表示可以恢復(fù)的異常,是編譯器可以捕捉到的;Error表示編譯時(shí)和系統(tǒng)錯誤,表示系統(tǒng)在運(yùn)行期間出現(xiàn)了嚴(yán)重的錯誤,屬于不可恢復(fù)的錯誤,由于這屬于JVM層次的嚴(yán)重錯誤,因此這種錯誤會導(dǎo)致程序終止執(zhí)行。Exception又分為檢查異常和運(yùn)行時(shí)異常。

異常類的結(jié)構(gòu)層次圖如下:

典型的RuntimeException(運(yùn)行時(shí)異常)包括NullPointerException, ClassCastException(類型轉(zhuǎn)換異常),IndexOutOfBoundsException(越界異常), IllegalArgumentException(非法參數(shù)異常),ArrayStoreException(數(shù)組存儲異常),AruthmeticException(算術(shù)異常),BufferOverflowException(緩沖區(qū)溢出異常)等;

非RuntimeException(檢查異常)包括IOException, SQLException,InterruptedException(中斷異常-調(diào)用線程睡眠時(shí)候),NumberFormatException(數(shù)字格式化異常)等。

而按照編譯器檢查方式劃分,異常又可以分為檢查型異常(CheckedException)和非檢查型異常 (UncheckedException)。Error和RuntimeException合起來稱為UncheckedException,之所以這么 稱呼,是因?yàn)榫幾g器不檢查方法是否處理或者拋出這兩種類型的異常,因此編譯期間出現(xiàn)這種類型的異常也不會報(bào)錯,默認(rèn)由虛擬機(jī)提供處理方式。除了Error 和RuntimeException這兩種類型的異常外,其它的異常都稱為Checked異常。

3、Java如何處理異常

3.1 try-catch, try-finally, try-catch-finally

對于checked類型異常,我們要么對它進(jìn)行處理,要么在方法頭使用throws拋出。

public static void createFile() throws IOException{
    File file = new File("C:/test.txt");
    if(!file.exists()){
            file.createNewFile();
    }
}
public static void main(String[] args) {
    try {
        createFile();
    } catch (IOException ex) {
        // handle exception here
    }
}

關(guān)于catch需要注意的幾點(diǎn):

1)、參數(shù)的異常類型必須是Throwable類或者其子類。

2)、從上往下的catch語句,其參數(shù)類型必須按照從子類到父類順序,因?yàn)橐坏┢ヅ涞揭粋€(gè)類型,就會忽略往后的catch。比如IOException必須放到Exception前面,否則編譯器會報(bào)錯。

3)、可以有一個(gè)或者多個(gè)catch語句,甚至如果有finally語句的情況下,可以沒有catch語句,如try-finally。

想要捕獲多個(gè)異常,可以使用多個(gè)catch語句,JDK7以后提供了另外一種方式:多重捕獲(multi-catch)。

try{
    // other code
} catch (IOException | SQLException ex) {
    throw ex;  
} 

4)、不要忽略異常。空的catch塊會使異常達(dá)不到應(yīng)有的目的,除非諸如關(guān)閉FileInputStream的時(shí)候,因?yàn)槟氵€沒有改變文件的狀態(tài),因此不必執(zhí)行任何恢復(fù)動作,并且已經(jīng)從文件中讀取到所需要的信息,因此不用終止正在進(jìn)行的操作。

關(guān)于finally需要注意的幾點(diǎn):

1)、finally中的代碼總是會被執(zhí)行,除非在執(zhí)行try或者catch語句時(shí)虛擬機(jī)退出(System.exit(1))。

2)、finally塊可以做一些資源清理工作,如關(guān)閉文件、關(guān)閉游標(biāo)等操作。

3)、finally塊不是必須的。

另外,如果在try和finally塊中都執(zhí)行了return語句,最終返回的將是finally中的return值。

3.2 異常鏈

常常想要在捕獲一個(gè)異常后拋出另外一個(gè)異常,并且希望把原始異常信息保存下來,這就是異常鏈。在JDK1.4以后,Throwable子類在構(gòu)造器 中可以接受一個(gè)cause對象作為參數(shù),表示原始異常,通過這樣把原始異常傳遞給新的異常,使得即使在當(dāng)前位置創(chuàng)建并拋出了新的異常,也能通過這個(gè)異常鏈 追蹤到異常最初發(fā)生的位置。

但在Throwable子類中,只有Error, Exception, RuntimeException三類異常類提供了帶cause參數(shù)的構(gòu)造器,其它類型的異常則需要通過initCause()方法。例如定義了CustomException類,可以這樣使用:

CustomException cmex = new CustomException();
cmex.initCause(new NullPointerException);
throw cmex;

這樣一來,CustomException繼承自Exception或RuntimeException,就屬于自定義異常了。

一般來說,自定義異常的作用有以下情形:

1)、將檢查型異常轉(zhuǎn)換為非檢查型異常。

2)、在產(chǎn)生異常時(shí)封裝上下文信息、定義異常碼、收集環(huán)境對象,有利于信息的傳遞。

4、異常使用指南

1)、在知道該如何處理的情況下才捕獲異常。

2)、自定義異常類型,用以封裝所有的檢查型異常。

3)、在程序的邊界進(jìn)行異常捕獲。如服務(wù)端相應(yīng)客戶端的請求,在出口處catch內(nèi)部有可能產(chǎn)生的異常,并統(tǒng)一throw一個(gè)封裝過的異常給客戶端,免得暴露服務(wù)端敏感信息。

4)、只針對異常的情況才使用異常。不要在所有的代碼中習(xí)慣性地使用try-catch,因?yàn)檫@會影響性能。

5)、拋出與抽象相對的異常。如果方法拋出的異常與它執(zhí)行的任務(wù)沒有明顯的聯(lián)系,這種情形會使人不知所措。為了避免這個(gè)問題,更高層的實(shí)現(xiàn)應(yīng)該捕獲 低層的異常,同時(shí)拋出可以按照高層抽象進(jìn)行解釋的異常,這種做法被稱為異常轉(zhuǎn)譯(exception translation),如下:

try{
    // use lower-level abstraction to do our bidding
} catch(LowerLevelException ex){
    throw new HigherLevelException(...);
}

另外一種特殊的異常轉(zhuǎn)譯稱為異常鏈,上面已作描述。如果低層的異常對于調(diào)試導(dǎo)致高層異常的問題非常有幫助,使用異常鏈就很合適。高層的異常提供訪問方法(Throwable.getCause)來獲得低層的異常。

6)、每個(gè)方法拋出的異常要有文檔描述。利用Javadoc的@throws標(biāo)記,記錄拋出每個(gè)異常的條件。如果一個(gè)方法可能拋出多個(gè)異常,不要使 用這些異常類的某個(gè)超類。如不要聲明一個(gè)方法“throws Exception”或“throws Throwable”,這將沒有任何指導(dǎo)信息。

歡迎加入學(xué)習(xí)交流群569772982,大家一起學(xué)習(xí)交流。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/68013.html

相關(guān)文章

  • JAVA系列】關(guān)于異常的一些事

    摘要:程序塊若有異常發(fā)生,程序的運(yùn)行便重點(diǎn),并拋出異常類所產(chǎn)生的對象。關(guān)鍵字我們可以使用關(guān)鍵字把可能拋出的異常顯式的標(biāo)注在方法定義的位置從而提醒調(diào)用者要注意捕獲這些異常。 ...

    不知名網(wǎng)友 評論0 收藏0
  • Java編程思想》 -- 異常總結(jié)

    摘要:總結(jié)異常總的來說還是很重要的,也是保障程序健壯性很重要的一欄,并且可以達(dá)到立竿見影的效果,這里只是基本總結(jié)了異常的一些常見問題,很多還得在自己運(yùn)用的過程中去探索。 概述 說起異常,我就想起了Bug,也就是常說的信春哥,無Bug,什么是Bug呢?我理解的Bug就是沒有按照自己原先假想的邏輯去執(zhí)行,這其中包括了兩個(gè)方面,一方面是代碼語法問題,一方面是邏輯問題,就比如正常邏輯買了東西要付款,...

    Pocher 評論0 收藏0
  • Java 異常入門(1/2)

    摘要:所有能夠處理該異常的方法,都來自一個(gè)叫做調(diào)用堆棧的方法列表。如果運(yùn)行環(huán)境在調(diào)用堆棧中自始至終未能找到捕獲這個(gè)異常的代碼塊,那么整個(gè)程序?qū)⒔K止運(yùn)行。 本文嘗試以盡可能詳細(xì)的方式介紹 Java 當(dāng)中的異常概念和處理機(jī)制。本文適合 Java 初學(xué)者閱讀。 什么是異常 異常是發(fā)生在程序運(yùn)行過程中的,阻斷正常流程中的指令執(zhí)行的事件。 當(dāng)一個(gè)方法在執(zhí)行當(dāng)中發(fā)生錯誤時(shí),這個(gè)方法就會創(chuàng)建一個(gè)特別...

    lucas 評論0 收藏0
  • Java 8 數(shù)據(jù)流教程

    摘要:數(shù)據(jù)流教程原文譯者飛龍協(xié)議這個(gè)示例驅(qū)動的教程是數(shù)據(jù)流的深入總結(jié)。但是的數(shù)據(jù)流是完全不同的東西。數(shù)據(jù)流是單體,并且在函數(shù)式編程中起到重要作用。列表上的所有流式操作請見數(shù)據(jù)流的。基本的數(shù)據(jù)流使用特殊的表達(dá)式,例如,而不是,而不是。 Java 8 數(shù)據(jù)流教程 原文:Java 8 Stream Tutorial 譯者:飛龍 協(xié)議:CC BY-NC-SA 4.0 這個(gè)示例驅(qū)動的教程是J...

    XUI 評論0 收藏0
  • Java經(jīng)典

    摘要:請注意,我們在聊聊單元測試遇到問題多思考多查閱多驗(yàn)證,方能有所得,再勤快點(diǎn)樂于分享,才能寫出好文章。單元測試是指對軟件中的最小可測試單元進(jìn)行檢查和驗(yàn)證。 JAVA容器-自問自答學(xué)HashMap 這次我和大家一起學(xué)習(xí)HashMap,HashMap我們在工作中經(jīng)常會使用,而且面試中也很頻繁會問到,因?yàn)樗锩嫣N(yùn)含著很多知識點(diǎn),可以很好的考察個(gè)人基礎(chǔ)。但一個(gè)這么重要的東西,我為什么沒有在一開始...

    xcold 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<