摘要:所幸,提供了一套機(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 接口。這些異常,又被分為 Error 和 Exception。這兩類異常,又衍生了一些子類。下面的圖片,描述了 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
摘要:本人生性愚鈍,在大學(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...
摘要:進(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月下一個版...
摘要:的作用是為其他線程的運行提供服務(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...
摘要:最近有不少初學(xué)編程的朋友問他們比較傾向于和作為他們首選學(xué)習(xí)語言,但是學(xué)好呢還是學(xué)更有前途到底哪一門語言更有錢途呢這個問題問的好,很多初學(xué)者都會有類似的疑問,今天我就來給大家簡單的解答一下。 ? ? ? ? 最近有不少初學(xué)編程的朋友問:他們比較傾向于Java和C++作為他們首選學(xué)習(xí)語言,但是...
摘要:包含了支持服務(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...
閱讀 1833·2023-04-26 02:32
閱讀 582·2021-11-18 13:12
閱讀 2461·2021-10-20 13:48
閱讀 2535·2021-10-14 09:43
閱讀 3845·2021-10-11 10:58
閱讀 3525·2021-09-30 10:00
閱讀 2946·2019-08-30 15:53
閱讀 3499·2019-08-30 15:53