摘要:所幸,提供了一套機制,用于在程序程序出錯出現異常時,進行報告錯誤保存工作結果讓用戶以更完善的方式退出程序亦即異常處理機制。顧名思義,該機制用于對程序運行中不正常的情況進行處理。如拋出比更加語義化學會把異常傳遞,即早拋出,晚捕獲
初識
代碼的世界和現實世界一樣,不會一帆風順,起碼不會像我們想象中的那么順利。寫代碼的是人,人的思維存在局限性,這種局限性,體現在代碼中,就是漏洞。倘若一段程序在生產環境中崩潰,勢必讓人十分惱火。這種讓人頭大的情況就是異常的一種。
Java 是這樣定義異常的:
異常指的是,那些在程序運行過程中,中斷正常的指令流程的事件。
實際上,異常還會在以下場景中發生:
用戶輸入錯誤,如:輸入不符合程序預期
設備錯誤,如:網線斷開連接
物理限制,如:內存不足
而我們并不希望程序因為上述情況掛掉,而是希望程序能夠在遇到異常時,巧妙地處理之后,繼續運行下去。
所幸,Java 提供了一套機制,用于在程序程序出錯(出現異常)時,進行:
報告錯誤
保存工作結果
讓用戶以更完善的方式退出程序
亦即:異常處理機制。顧名思義,該機制用于對程序運行中不正常的情況進行處理。
簡單來說,Java 中的異常處理是:當異常發生時,運行時系統逆著方法的調用棧(call stack)去尋找能夠處理這種異常的東西。
以一個把字符串轉換成整數的方法為例:
public Integer stringToNumber(String strToFormat){ Integer targetNum; try{ targetNum = new Integer(strToFormat); }catch(NumberFormatException e){ targetNum = DEFAULT_NUM; } return targetNum; }
在上述代碼中,當 strToFormat 不能轉化成一個整形數時,就轉化成一個默認的值。NumberFormatException 發生時,方法立即終止。控制權被交由 catch 代碼塊,也就是異常處理器(exception hanlder)。代碼雖然簡單,卻包含了 Java 異常處理的一般步驟。
異常分類在 Java 中,所有的異常派生于 Throwable 接口。這些異常,又被分為 Error 和 Exception。這兩類異常,又衍生了一些子類。下面的圖片,描述了 Java 的異常體系圖:
不過,我們應當把精力放在 RuntimeException 上,因為“所有的運行時異常,都是程序員的問題”。這類異常,又被叫做未檢查異常,通常交由 JVM 處理。相對應的,那些我們知道可能會出現問題、,被叫做已檢查的異常。這類異常需要開發者手動向上級拋出,直到 JVM 級別,或者在調用方法時使用 try-catch 處理。
一般來說,在寫一個方法時,要盡可能聲明所有已檢查異常,通過內部邏輯控制,避免未檢查(運行時)異常。
異常捕獲在編碼過程中,如果方法的檢查異常被精心設計,那么我們只管拋出異常即可。但是,一旦調用方法的地方沒有對這種可能出現的異常進行處理,那么程序就會終止。所以,要對異常進行捕獲操作,正如之前的字符串轉數字的方法一樣。
根據經驗,程序中應該捕獲那些知道如何處理的異常,把“職責”外的異常,交給方法的調用者去處理。下面是一個異常捕獲流程的示例代碼:
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; } }
在上述代碼中,① 中進行操作,捕獲了 Exeptionx 或者 Exceptiony 時,② 進行異常處理;捕獲了 Exception1 時, ③ 把該異常包裝;捕獲了 Exception 2 時,④ 直接拋出異常;無論有無異常發生,⑤ 都會執行。
上面的代碼還有一個問題,就是 finally 代碼中包含返回值。有以下規則:
try 代碼塊中包含 return 語句,finally 語句中的代碼也會被執行;若 finally 中也包含 return 語句,則會替代 try 中的語句
使用異常的技巧不要過分細分異常,能用一個 try 塊處理的盡量用一個,然后按層次捕獲異常,下面的代碼是被建議的:
try{ // 某些操作 }catch(SomeException1 e1){ // 異常 1 的處理 }catch(SomeException2 e2){ // 異常 2 的處理 }
適當地轉化異常,如:可以把一個 NumberFormatException 轉化成自定義的異常
遇到異常情況,可以更加嚴格一點。如:拋出 EmptyStackException 比 NullPointerException 更加語義化
學會把異常傳遞,即:「早拋出,晚捕獲」
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/71174.html
摘要:本人生性愚鈍,在大學期間沒能好好領略等面向對象編程的魅力?,F借助一些較為權威的書籍資料,將基礎知識里比較重要的東西整理成文,命名從基礎學。如果博文不慎侵犯了您的著作權,請聯系我。 和很多大學一樣,我的學校也是從 Java 、C++ 入手,教給我們面向對象 (OOP) 的思想。本人生性愚鈍,在大學期間沒能好好領略 Java 等面向對象編程的魅力?,F借助一些較為權威的書籍資料,將 Java...
摘要:進階多線程開發關鍵技術后端掘金原創文章,轉載請務必將下面這段話置于文章開頭處保留超鏈接。關于中間件入門教程后端掘金前言中間件 Java 開發人員最常犯的 10 個錯誤 - 后端 - 掘金一 、把數組轉成ArrayList 為了將數組轉換為ArrayList,開發者經常... Java 9 中的 9 個新特性 - 后端 - 掘金Java 8 發布三年多之后,即將快到2017年7月下一個版...
摘要:的作用是為其他線程的運行提供服務,比如說線程。在某些平臺上,指定一個較高的參數值可能使線程在拋出之前達到較大的遞歸深度。參數的值與最大遞歸深度和并發程度之間的關系細節與平臺有關。 今天研究了下Java線程基礎知識,發現以前太多知識知識略略帶過了,比較說Java的線程機制,在Java中有兩類線程:User Thread(用戶線程)、Daemon Thread(守護線程),以及構造器中的s...
摘要:最近有不少初學編程的朋友問他們比較傾向于和作為他們首選學習語言,但是學好呢還是學更有前途到底哪一門語言更有錢途呢這個問題問的好,很多初學者都會有類似的疑問,今天我就來給大家簡單的解答一下。 ? ? ? ? 最近有不少初學編程的朋友問:他們比較傾向于Java和C++作為他們首選學習語言,但是...
摘要:包含了支持服務開發的類,并為提供基礎,如語言基礎操作操作網絡通信以及多線程等技術。在運行文件時,的解釋器對這些字節碼進行解釋執行,執行過程中需要加入的類在連接階段被載入到運行環境中。支持多個線程同時執行,并提供多線程之間的同步機制。 1.什么是Java語言 簡單地說,Java 是由 Sun Microsystems 公司于 1995 年推出的一門面向對象程序設計語言。2009 年 Or...
閱讀 1804·2023-04-26 02:32
閱讀 567·2021-11-18 13:12
閱讀 2446·2021-10-20 13:48
閱讀 2515·2021-10-14 09:43
閱讀 3825·2021-10-11 10:58
閱讀 3483·2021-09-30 10:00
閱讀 2932·2019-08-30 15:53
閱讀 3487·2019-08-30 15:53