成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

【從基礎(chǔ)學(xué) Java】異常機(jī)制

enda / 712人閱讀

摘要:所幸,提供了一套機(jī)制,用于在程序程序出錯出現(xiàn)異常時,進(jìn)行報告錯誤保存工作結(jié)果讓用戶以更完善的方式退出程序亦即異常處理機(jī)制。顧名思義,該機(jī)制用于對程序運行中不正常的情況進(jìn)行處理。如拋出比更加語義化學(xué)會把異常傳遞,即早拋出,晚捕獲

初識

代碼的世界和現(xiàn)實世界一樣,不會一帆風(fēng)順,起碼不會像我們想象中的那么順利。寫代碼的是人,人的思維存在局限性,這種局限性,體現(xiàn)在代碼中,就是漏洞。倘若一段程序在生產(chǎn)環(huán)境中崩潰,勢必讓人十分惱火。這種讓人頭大的情況就是異常的一種。

Java 是這樣定義異常的:

異常指的是,那些在程序運行過程中,中斷正常的指令流程的事件。

實際上,異常還會在以下場景中發(fā)生:

用戶輸入錯誤,如:輸入不符合程序預(yù)期

設(shè)備錯誤,如:網(wǎng)線斷開連接

物理限制,如:內(nèi)存不足

而我們并不希望程序因為上述情況掛掉,而是希望程序能夠在遇到異常時,巧妙地處理之后,繼續(xù)運行下去。

所幸,Java 提供了一套機(jī)制,用于在程序程序出錯(出現(xiàn)異常)時,進(jìn)行:

報告錯誤

保存工作結(jié)果

讓用戶以更完善的方式退出程序

亦即:異常處理機(jī)制。顧名思義,該機(jī)制用于對程序運行中不正常的情況進(jìn)行處理。
簡單來說,Java 中的異常處理是:當(dāng)異常發(fā)生時,運行時系統(tǒng)逆著方法的調(diào)用棧(call stack)去尋找能夠處理這種異常的東西。

以一個把字符串轉(zhuǎn)換成整數(shù)的方法為例:

public Integer stringToNumber(String strToFormat){
    Integer targetNum;
    try{
        targetNum = new Integer(strToFormat);
    }catch(NumberFormatException e){
        targetNum = DEFAULT_NUM;
    }
    return targetNum;
}

在上述代碼中,當(dāng) strToFormat 不能轉(zhuǎn)化成一個整形數(shù)時,就轉(zhuǎn)化成一個默認(rèn)的值。NumberFormatException 發(fā)生時,方法立即終止??刂茩?quán)被交由 catch 代碼塊,也就是異常處理器(exception hanlder)。代碼雖然簡單,卻包含了 Java 異常處理的一般步驟。

異常分類

在 Java 中,所有的異常派生于 Throwable 接口。這些異常,又被分為 ErrorException。這兩類異常,又衍生了一些子類。下面的圖片,描述了 Java 的異常體系圖:

不過,我們應(yīng)當(dāng)把精力放在 RuntimeException 上,因為“所有的運行時異常,都是程序員的問題”。這類異常,又被叫做未檢查異常,通常交由 JVM 處理。相對應(yīng)的,那些我們知道可能會出現(xiàn)問題、,被叫做已檢查的異常。這類異常需要開發(fā)者手動向上級拋出,直到 JVM 級別,或者在調(diào)用方法時使用 try-catch 處理。

一般來說,在寫一個方法時,要盡可能聲明所有已檢查異常,通過內(nèi)部邏輯控制,避免未檢查(運行時)異常。

異常捕獲

在編碼過程中,如果方法的檢查異常被精心設(shè)計,那么我們只管拋出異常即可。但是,一旦調(diào)用方法的地方?jīng)]有對這種可能出現(xiàn)的異常進(jìn)行處理,那么程序就會終止。所以,要對異常進(jìn)行捕獲操作,正如之前的字符串轉(zhuǎn)數(shù)字的方法一樣。

根據(jù)經(jīng)驗,程序中應(yīng)該捕獲那些知道如何處理的異常,把“職責(zé)”外的異常,交給方法的調(diào)用者去處理。下面是一個異常捕獲流程的示例代碼:

    modifier returnType someMethod(type1 param1, type2 param2) throws Exception1, Exceptio2{
    
        try{
            ① // 某些操作
            return returnType value;
        }catch(Exceptionx | Exceptiony e){
            ② // 處理異常
        }catch(Excpetion1 e1){
            ③ throw new Excption1(e1);
        }catch(Exception e2){
            ④ throw e2;
        }finally{
            ⑤ // 一些操作
            return returnType mockValue;
        }
        
}   

在上述代碼中,① 中進(jìn)行操作,捕獲了 Exeptionx 或者 Exceptiony 時,② 進(jìn)行異常處理;捕獲了 Exception1 時, ③ 把該異常包裝;捕獲了 Exception 2 時,④ 直接拋出異常;無論有無異常發(fā)生,⑤ 都會執(zhí)行。

上面的代碼還有一個問題,就是 finally 代碼中包含返回值。有以下規(guī)則:

try 代碼塊中包含 return 語句,finally 語句中的代碼也會被執(zhí)行;若 finally 中也包含 return 語句,則會替代 try 中的語句

使用異常的技巧

不要過分細(xì)分異常,能用一個 try 塊處理的盡量用一個,然后按層次捕獲異常,下面的代碼是被建議的:

try{
    // 某些操作
}catch(SomeException1 e1){
    // 異常 1 的處理
}catch(SomeException2 e2){
    // 異常 2 的處理
}

適當(dāng)?shù)剞D(zhuǎn)化異常,如:可以把一個 NumberFormatException 轉(zhuǎn)化成自定義的異常

遇到異常情況,可以更加嚴(yán)格一點。如:拋出 EmptyStackException 比 NullPointerException 更加語義化

學(xué)會把異常傳遞,即:「早拋出,晚捕獲」

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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/71174.html

相關(guān)文章

  • 基礎(chǔ)學(xué) Java】序

    摘要:本人生性愚鈍,在大學(xué)期間沒能好好領(lǐng)略等面向?qū)ο缶幊痰镊攘Α,F(xiàn)借助一些較為權(quán)威的書籍資料,將基礎(chǔ)知識里比較重要的東西整理成文,命名從基礎(chǔ)學(xué)。如果博文不慎侵犯了您的著作權(quán),請聯(lián)系我。 和很多大學(xué)一樣,我的學(xué)校也是從 Java 、C++ 入手,教給我們面向?qū)ο?(OOP) 的思想。本人生性愚鈍,在大學(xué)期間沒能好好領(lǐng)略 Java 等面向?qū)ο缶幊痰镊攘Α,F(xiàn)借助一些較為權(quán)威的書籍資料,將 Java...

    JackJiang 評論0 收藏0
  • java篇 - 收藏集 - 掘金

    摘要:進(jìn)階多線程開發(fā)關(guān)鍵技術(shù)后端掘金原創(chuàng)文章,轉(zhuǎn)載請務(wù)必將下面這段話置于文章開頭處保留超鏈接。關(guān)于中間件入門教程后端掘金前言中間件 Java 開發(fā)人員最常犯的 10 個錯誤 - 后端 - 掘金一 、把數(shù)組轉(zhuǎn)成ArrayList 為了將數(shù)組轉(zhuǎn)換為ArrayList,開發(fā)者經(jīng)常... Java 9 中的 9 個新特性 - 后端 - 掘金Java 8 發(fā)布三年多之后,即將快到2017年7月下一個版...

    OpenDigg 評論0 收藏0
  • 一起學(xué)并發(fā)編程 - 守護(hù)線程

    摘要:的作用是為其他線程的運行提供服務(wù),比如說線程。在某些平臺上,指定一個較高的參數(shù)值可能使線程在拋出之前達(dá)到較大的遞歸深度。參數(shù)的值與最大遞歸深度和并發(fā)程度之間的關(guān)系細(xì)節(jié)與平臺有關(guān)。 今天研究了下Java線程基礎(chǔ)知識,發(fā)現(xiàn)以前太多知識知識略略帶過了,比較說Java的線程機(jī)制,在Java中有兩類線程:User Thread(用戶線程)、Daemon Thread(守護(hù)線程),以及構(gòu)造器中的s...

    junnplus 評論0 收藏0
  • 學(xué)Java好呢?還是學(xué)C++更有前途?

    摘要:最近有不少初學(xué)編程的朋友問他們比較傾向于和作為他們首選學(xué)習(xí)語言,但是學(xué)好呢還是學(xué)更有前途到底哪一門語言更有錢途呢這個問題問的好,很多初學(xué)者都會有類似的疑問,今天我就來給大家簡單的解答一下。 ? ? ? ? 最近有不少初學(xué)編程的朋友問:他們比較傾向于Java和C++作為他們首選學(xué)習(xí)語言,但是...

    jiekechoo 評論0 收藏0
  • java入門

    摘要:包含了支持服務(wù)開發(fā)的類,并為提供基礎(chǔ),如語言基礎(chǔ)操作操作網(wǎng)絡(luò)通信以及多線程等技術(shù)。在運行文件時,的解釋器對這些字節(jié)碼進(jìn)行解釋執(zhí)行,執(zhí)行過程中需要加入的類在連接階段被載入到運行環(huán)境中。支持多個線程同時執(zhí)行,并提供多線程之間的同步機(jī)制。 1.什么是Java語言 簡單地說,Java 是由 Sun Microsystems 公司于 1995 年推出的一門面向?qū)ο蟪绦蛟O(shè)計語言。2009 年 Or...

    zhangfaliang 評論0 收藏0

發(fā)表評論

0條評論

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