电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

帶你了解Java中的異常處理(下)

瀏覽:8日期:2022-08-27 08:00:06

今天繼續講解java中的異常處理機制,主要介紹Exception家族的主要成員,自定義異常,以及異常處理的正確姿勢。

Exception家族

一圖勝千言,先來看一張圖。

帶你了解Java中的異常處理(下)

Exception這是一個父類,它有兩個兒子,IOException和RuntimeException,每個兒子都很能生,所以它有著一堆的孫子,但其實,Exception家族還有一個大家伙,那就是Throwable,這是一個接口,看名字就知道意思,就是“可被拋出”嘛,它還有一個同父異母的哥哥,那就是Error,這家伙可厲害了,Error類一般是指與虛擬機相關的問題,如系統崩潰,虛擬機錯誤,內存空間不足,方法調用棧溢出等。catch語句里,不僅可以catch住Exception,還能catch住Error(什么?你真的打算catch Error??程獨秀同學,你先坐下。)一般情況下,是不能捕獲Error的,對于這類錯誤,Java編譯器不去檢查他們。對于這類錯誤的導致的應用程序中斷,僅靠程序本身無法恢復和預防,遇到這樣的錯誤,建議讓程序終止。除非你有把握能正確處理,否則程獨秀同學還是坐下吧(滑稽)。

Unchecked Exception和Checked Exception

你也許會一臉懵逼,???,這是啥?異常也是分派別的,Unchecked Exception表示“未檢查異?!埃珻hecked Exception自然就是”已檢查異?!?,派生于Error或者RuntimeException的異常稱為unchecked異常,所有其他的異常成為checked異常。那問題來了,為啥要區分這兩種異常?

我們可以再看看上面那個圖,可以看出,RuntimeException和Error都是由程序內部引發的錯誤,比如上一篇里所說的空指針和算術異常。而Checked Exception則大都是由外部因素導致的,如文件無法找到異常,這是虛擬機無法掌控的情況,當出現異常,虛擬機也只能一臉懵逼,不知道該如何是好,所以當有可能發生時,就必須要使用try..catch去捕獲它,而對于Unchecked Exception 時,大部分是由于代碼引發的,所以只要代碼寫的足夠完善,是不會拋出這樣的異常的,所以也不強制要求捕獲。

所以原因其實很簡單,編譯器將檢查你是否為所有的已檢查異常提供了異常處理機制,比如說我們使用Class.forName()來查找給定的字符串的class對象的時候,如果沒有為這個方法提供異常處理,編譯是無法通過的。已檢查異常的意義就在于讓你知道,這地方是有可能拋異常的,你要注意了,趕緊捕獲了。

自定義異常

那么如何自定義一個異常呢?其實很簡單,只需要繼承Exception類就好了??聪旅娴睦踝樱?/p>

public class MyException extends Exception { public MyException() { super(); } public MyException(String message) { super(message); } public MyException(String message, Throwable cause) { super(message, cause); } public MyException(Throwable cause) { super(cause); } protected MyException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { super(message, cause, enableSuppression, writableStackTrace); }}

MyException繼承了Exception類,重寫了構造函數,并沒有加自己的邏輯,只是調用了父類的方法。你看,自定義一個異常其實很簡單吧??吹竭@你也許又疑惑了,這尼瑪好像就是給Exception換了個名字,有啥用???

別急,別急,你忘了嗎,Exception不僅是可以捕獲的,還是可以主動拋出的,所以當遇到某些特定的情況時,我們就可以主動拋出異常,然后在調用時去捕獲它,獲取異常信息,如果直接用Exception的話,那么捕獲的時候,會把所有的異常,該捕獲不該捕獲的都一起捕獲了,那么就沒法區分哪些是我們主動拋出來的異常了,這樣就無法對那些異常進行特殊處理了。

異常處理的正確姿勢

接下來要簡單介紹一個實際使用中常用的異常處理方法——異常鏈化處理。

在一些大型的,模塊化的軟件開發中,一旦一個地方發生異常,則如骨牌效應一樣,將導致出現一連串的異常。假設B模塊需要調用A模塊的方法,如果A模塊發生異常,則B也將不能完成而發生異常,但是B在拋出異常時,會將A的異常信息掩蓋掉,這將使得異常的根源信息丟失。而使用異常的鏈化可以將多個模塊的異常串聯起來,使得異常信息不會丟失。

異常鏈化就是用一個異常對象為參數構造新的異常對象。新的異對象將包含先前異常的信息。這項技術主要是異常類的一個帶Throwable參數的函數來實現的。這個當做參數的異常,我們叫他根源異常(cause)。如果你細心一點的話,會發現上面的栗子里也有一個叫做cause的東西,沒錯,說的其實就是它,在new一個新的異常時,將之前的異常信息傳入構造函數即可。下面再用一個簡單的栗子進行說明:

public class Test { public static void main(String[] args) { System.out.println('請輸入2個加數'); int result; try { result = add(); System.out.println('結果:'+result); } catch (Exception e){ e.printStackTrace(); } } /** * 執行加法計算 */ private static int add() throws Exception { int result; try { List<Integer> nums =getInputNumbers(); result = nums.get(0) + nums.get(1); }catch(InputMismatchException immExp){ //鏈化:以一個異常對象為參數構造新的異常對象。 throw new Exception('計算失敗',immExp); } return result; } /** * 獲取輸入的整數 */ private static List<Integer> getInputNumbers() { List<Integer> nums = new ArrayList<>(); Scanner scan = new Scanner(System.in); try { int num1 = scan.nextInt(); int num2 = scan.nextInt(); nums.add(new Integer(num1)); nums.add(new Integer(num2)); }catch(InputMismatchException immExp){ throw immExp; }finally { scan.close(); } return nums; }}

輸出如下:

請輸入2個加數d djava.lang.Exception: 計算失敗at com.frank.chapter17.Test.add(Test.java:35)at com.frank.chapter17.Test.main(Test.java:18)Caused by: java.util.InputMismatchExceptionat java.util.Scanner.throwFor(Scanner.java:864)at java.util.Scanner.next(Scanner.java:1485)at java.util.Scanner.nextInt(Scanner.java:2117)at java.util.Scanner.nextInt(Scanner.java:2076)at com.frank.chapter17.Test.getInputNumbers(Test.java:47)at com.frank.chapter17.Test.add(Test.java:31)... 1 more

可以看到,當輸入的不是整數時,發生了異常,在getInputNumbers方法里沒有處理這個異常,而是將它繼續拋出,在add方法里捕獲了異常之后,以該異常為構造參數,重新拋出了一個異常,從打印輸出的信息可以看到,不僅僅有第二次拋出的異常信息,第一次的輸出信息不匹配異常的詳細信息也包含在了里面,銜接在Caused by之后,形成了一條異常鏈,這樣可以方便我們更快的排查問題所在。

至此,異常就講解完畢了,希望能給大家帶來一些啟發和思考,如果覺得還算ok的話,記得動動小手點推薦,讓更多人可以看到,也歡迎關注我的博客,會持續更新的。如果有什么講的不好的地方。。。emmmmmm,你倒是來打我呀(逃)

以上就是帶你了解Java中的異常處理(下)的詳細內容,更多關于Java 異常處理的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
主站蜘蛛池模板: 山东PE给水管厂家,山东双壁波纹管,山东钢带增强波纹管,山东PE穿线管,山东PE农田灌溉管,山东MPP电力保护套管-山东德诺塑业有限公司 | 污水处理设备,一体化泵站,一体化净水设备-「梦之洁环保设备厂家」 | 接地电阻测试仪[厂家直销]_电缆故障测试仪[精准定位]_耐压测试仪-武汉南电至诚电力设备 | 济南ISO9000认证咨询代理公司,ISO9001认证,CMA实验室认证,ISO/TS16949认证,服务体系认证,资产管理体系认证,SC食品生产许可证- 济南创远企业管理咨询有限公司 郑州电线电缆厂家-防火|低压|低烟无卤电缆-河南明星电缆 | 软文发布-新闻发布推广平台-代写文章-网络广告营销-自助发稿公司媒介星 | 广东成考网-广东成人高考网 | 断桥铝破碎机_发动机破碎机_杂铝破碎机厂家价格-皓星机械 | 佛山商标注册_商标注册代理|专利注册申请_商标注册公司_鸿邦知识产权 | 众品家具网-家具品牌招商_家具代理加盟_家具门户的首选网络媒体。 | 锂电池生产厂家-电动自行车航模无人机锂电池定制-世豹新能源 | 气体热式流量计-定量控制流量计(空气流量计厂家)-湖北南控仪表科技有限公司 | 卓能JOINTLEAN端子连接器厂家-专业提供PCB接线端子|轨道式端子|重载连接器|欧式连接器等电气连接产品和服务 | 美国查特CHART MVE液氮罐_查特杜瓦瓶_制造全球品质液氮罐 | 无菌实验室规划装修设计-一体化实验室承包-北京洁净净化工程建设施工-北京航天科恩实验室装备工程技术有限公司 | 尊享蟹太太美味,大闸蟹礼卡|礼券|礼盒在线预订-蟹太太官网 | 郑州爱婴幼师学校_专业幼师培训_托育师培训_幼儿教育培训学校 | 机器视觉检测系统-视觉检测系统-机器视觉系统-ccd检测系统-视觉控制器-视控一体机 -海克易邦 | 脉冲布袋除尘器_除尘布袋-泊头市净化除尘设备生产厂家 | 滚筒烘干机_转筒烘干机_滚筒干燥机_转筒干燥机_回转烘干机_回转干燥机-设备生产厂家 | 冻干机(冷冻干燥机)_小型|实验型|食品真空冷冻干燥机-松源 | 广东青藤环境科技有限公司-水质检测| 健身器材-健身器材厂家专卖-上海七诚健身器材有限公司 | 流变仪-热分析联用仪-热膨胀仪厂家-耐驰科学仪器商贸 | 茶楼装修设计_茶馆室内设计效果图_云臻轩茶楼装饰公司 | 阴离子_阳离子聚丙烯酰胺厂家_聚合氯化铝价格_水处理絮凝剂_巩义市江源净水材料有限公司 | 干式变压器厂_干式变压器厂家_scb11/scb13/scb10/scb14/scb18干式变压器生产厂家-山东科锐变压器有限公司 | 上海新光明泵业制造有限公司-电动隔膜泵,气动隔膜泵,卧式|立式离心泵厂家 | 三氯异氰尿酸-二氯-三氯-二氯异氰尿酸钠-优氯净-强氯精-消毒片-济南中北_优氯净厂家 | 帽子厂家_帽子工厂_帽子定做_义乌帽厂_帽厂_制帽厂_帽子厂_浙江高普制帽厂 | 数码听觉统合训练系统-儿童感觉-早期言语评估与训练系统-北京鑫泰盛世科技发展有限公司 | 盘装氧量分析仪-防爆壁挂氧化锆分析仪-安徽吉帆仪表有限公司 | HDPE土工膜,复合土工膜,防渗膜价格,土工膜厂家-山东新路通工程材料有限公司 | 贴片电感_贴片功率电感_贴片绕线电感_深圳市百斯特电子有限公司 贴片电容代理-三星电容-村田电容-风华电容-国巨电容-深圳市昂洋科技有限公司 | 彼得逊采泥器-定深式采泥器-电动土壤采样器-土壤样品风干机-常州索奥仪器制造有限公司 | 转子泵_凸轮泵_凸轮转子泵厂家-青岛罗德通用机械设备有限公司 | 温控器生产厂家-提供温度开关/热保护器定制与批发-惠州市华恺威电子科技有限公司 | 全自动在线分板机_铣刀式在线分板机_曲线分板机_PCB分板机-东莞市亿协自动化设备有限公司 | 体视显微镜_荧光生物显微镜_显微镜报价-微仪光电生命科学显微镜有限公司 | 中国玩具展_玩具展|幼教用品展|幼教展|幼教装备展 | 厌氧工作站-通用型厌氧工作站-上海胜秋科学仪器有限公司 | 钢格板|镀锌钢格板|热镀锌钢格板|格栅板|钢格板|钢格栅板|热浸锌钢格板|平台钢格板|镀锌钢格栅板|热镀锌钢格栅板|平台钢格栅板|不锈钢钢格栅板 - 专业钢格板厂家 |