摘要:對(duì)異常的處理方法是打印異常的跟蹤棧信息并終止程序運(yùn)行。應(yīng)盡量對(duì)異常進(jìn)行適當(dāng)?shù)奶幚恚皇呛?jiǎn)單的將異常跟蹤棧信息打印出來。
一、異常概述
開發(fā)者都希望所有錯(cuò)誤都能在編譯階段被發(fā)現(xiàn),就是試圖在運(yùn)行程序之前排除所有錯(cuò)誤,但這是不現(xiàn)實(shí)的,余下問題必須在運(yùn)行期間得到解決。 Java將異常分為兩種:CheckedException和RuntimeException。其中,CheckedException都是可以在編譯期間被處理的異常,而RuntimeException異常則無需處理。 增加了異常處理機(jī)制后的程序有更好的容錯(cuò)性,更健壯。二、異常處理機(jī)制
Java異常處理機(jī)制可以讓程序有更好的容錯(cuò)性,讓程序更健壯。異常處理機(jī)制可以實(shí)現(xiàn)將“業(yè)務(wù)功能實(shí)現(xiàn)代碼”和“錯(cuò)誤處理代碼”分離,提供更好的可讀性。
1.使用try...catch...捕獲異常
把系統(tǒng)業(yè)務(wù)實(shí)現(xiàn)代碼放在try塊中定義,所有異常處理邏輯放入catch塊中進(jìn)行處理。下面是Java異常處理機(jī)制的語法結(jié)構(gòu):
如果執(zhí)行try塊里的業(yè)務(wù)邏輯代碼出現(xiàn)異常,系統(tǒng)自動(dòng)生成一個(gè)異常對(duì)象,該異常對(duì)象被提交給Java運(yùn)行時(shí)環(huán)境,這個(gè)過程被稱為拋出異常。
當(dāng)Java運(yùn)行時(shí)環(huán)境收到異常對(duì)象時(shí),會(huì)自動(dòng)尋找能處理該異常對(duì)象的catch塊,如果找到合適的catch塊,則把該異常對(duì)象交給該catch塊處理,這個(gè)過程被稱為捕獲異常。
提示:1.如果程序沒有為這段代碼定義任何的catch塊,則Java運(yùn)行環(huán)境無法找到處理該異常的catch塊,程序就在此退出。
2.try塊中聲明的變量是代碼塊內(nèi)局部變量,它只在try塊中有效,在catch塊中不能訪問該變量。
2.異常類的繼承體系
Java把所有非正常情況分為:異常(Exception)和錯(cuò)誤(Error)他們都繼承Throwable父類。 Error錯(cuò)誤:一般是指與虛擬機(jī)相關(guān)的錯(cuò)誤,如系統(tǒng)崩潰、虛擬機(jī)錯(cuò)誤、動(dòng)態(tài)鏈接失敗等。這種錯(cuò)誤無法恢復(fù)和不可能捕獲,將導(dǎo)致應(yīng)用程序中斷。 進(jìn)行異常捕獲時(shí),應(yīng)遵循先處理小異常,再處理大異常。
3.Java7提供的多異常捕獲
從Java7開始,一個(gè)catch塊可以捕獲多種類型異常。 應(yīng)注意以下2個(gè)地方: 1)捕獲多個(gè)類型的異常時(shí),多種異常類型應(yīng)用豎線(|)隔開。 2)捕獲多個(gè)類型的異常時(shí),異常變量有隱式的final修飾,因此程序不能對(duì)異常變量重新賦值。
4.使用finally回收資源
有時(shí)候,程序在try塊中打開了一些物理資源(例如數(shù)據(jù)庫(kù)連接等), 這些都必須顯式回收。為了保證一定能回收try塊中打開的物理資源,異常處理機(jī)制提供了finally語句塊。不論try塊中代碼是否出現(xiàn)異常,也不管哪一個(gè)catch塊被執(zhí)行,甚至try塊或catch塊中執(zhí)行了return語句,finally塊總會(huì)被執(zhí)行。但如果在try塊或catch塊中使用System.exit(1)語句退出虛擬機(jī),則finally塊將失去執(zhí)行機(jī)會(huì)。 完整的Java異常處理語法結(jié)構(gòu)如下:
通常情況下,不要在finally塊中使用如 return或throw等導(dǎo)致方法終止的語句,一旦在finally塊中使用此類語句,將導(dǎo)致try塊、catch塊中的return或throw語句失效。
5.自動(dòng)關(guān)閉資源的try語句
允許在try塊關(guān)鍵字后緊跟一對(duì)圓括號(hào),圓括號(hào)可以聲明、初始化一個(gè)或多個(gè)資源,此處的資指的是那些必須在程序結(jié)束時(shí)顯示關(guān)閉資源(如數(shù)據(jù)庫(kù)連接,網(wǎng)絡(luò)連接等),try語句塊在該語句塊結(jié)束時(shí)自動(dòng)關(guān)閉這些資源。
為保證try語句塊可以正常關(guān)閉資源,這些方法必須實(shí)現(xiàn)AutoCloseable或Closeable接口,實(shí)現(xiàn)這兩種接口就必須實(shí)現(xiàn)close()方法。
Java將異常分為兩種:CheckedException和RuntimeException。
對(duì)于CheckedException的處理方式有兩種:
1)當(dāng)前方法知道如何處理該異常,程序使用try...catch...塊來捕獲該異常,然后在其對(duì)應(yīng)的catch塊中處理該異常。
2)當(dāng)前方法不知道如何處理這種異常,應(yīng)該在定義方法時(shí)聲明拋出該異常。
1.使用throws聲明拋出異常
使用throws聲明拋出異常的思路是:當(dāng)前方法不知道該如何處理此異常,該異常應(yīng)該由上一級(jí)調(diào)用者;如果main()方法也不知道該如何處理此異常,也可用throws聲明拋出異常,該異常將交給JVM處理。JVM對(duì)異常的處理方法是:打印異常的跟蹤棧信息,并終止程序運(yùn)行。這也就是程序遇到異常后自動(dòng)結(jié)束的原因。
throws聲明只能用在方法簽名中,throws可聲明拋出多個(gè)異常類,多個(gè)異常類之間用逗號(hào)(,)隔開。throws聲明語法格式如下:
throws Exception1,Exception2...
一旦使用throws聲明拋出該異常,就無需使用try...catch語句塊來捕獲該異常。
使用throws聲明拋出異常時(shí),有一個(gè)限制:子類方法聲明拋出的異常類型應(yīng)該是父類方法聲明拋出的異常的子類或者相同,子類方法聲明拋出的異常不允許比父類方法聲明拋出的異常多。
2.使用throw拋出異常
如果需要在程序中自行拋出異常,則應(yīng)使用throw語句,throw語句可多帶帶使用,throw語句拋出的不是異常類,而是一個(gè)異常實(shí)例,且每次只能拋出一個(gè)異常實(shí)例。throw語句語法格式如下:
throw ExceptionInstance;
3.自定義異常
用戶自定義異常都應(yīng)該繼承Exception基類,如果希望自定義Runtim異常,則應(yīng)繼承RuntimeException基類。自定義異常格式如下:
4.異常鏈
程序捕獲原始異常,然后拋出一個(gè)新的業(yè)務(wù)異常,新的業(yè)務(wù)異常中包含了對(duì)用戶的提示信息,這種處理方式稱為異常轉(zhuǎn)譯。
這種把原始信息隱藏起來,僅向上提供必要的異常提示信息的處理方式,可以保證底層異常不會(huì)擴(kuò)散到表現(xiàn)層,可以避免向上暴露太多的實(shí)現(xiàn)細(xì)節(jié),符合面向?qū)ο蟮姆庋b原則。
這種把捕獲一個(gè)異常然后緊接著拋出另一個(gè)異常,并把原始異常信息保存下來的方式是一種典型的鏈?zhǔn)教幚恚脖环Q為異常鏈。
四、Java的異常跟蹤棧異常對(duì)象的printStackTrace()方法用于打印異常的跟蹤棧信息,根據(jù)printStackTrace()方法的輸出結(jié)果,可以找到異常的源頭,并跟蹤到異常的一路觸發(fā)過程。應(yīng)盡量對(duì)異常進(jìn)行適當(dāng)?shù)奶幚恚皇呛?jiǎn)單的將異常跟蹤棧信息打印出來。
五、異常處理規(guī)則1.不要過度使用異常
2.不要使用過于龐大的try塊
3.避免使用catchAll語句
4.不要忽略捕獲到的異常
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/70192.html
摘要:不受檢查異常為編譯器不要求強(qiáng)制處理的異常,檢查異常則是編譯器要求必須處置的異常。潛在的異常處理器是異常發(fā)生時(shí)依次存留在調(diào)用棧中的方法的集合。當(dāng)運(yùn)行時(shí)系統(tǒng)遍歷調(diào)用棧而未找到合適的異常處理器,則運(yùn)行時(shí)系統(tǒng)終止。異常處理涉及到五個(gè)關(guān)鍵字,分別是。 概念 程序運(yùn)行時(shí),發(fā)生的不被期望的事件,它阻止了程序按照程序員的預(yù)期正常執(zhí)行,這就是異常。 異常是程序中的一些錯(cuò)誤,但并不是所有的錯(cuò)誤都是異常,并...
摘要:根據(jù)異常對(duì)象判斷是否存在異常處理。否則,范圍小的異常會(huì)因異常處理完成而無法處理。異常處理中使用作為異常的統(tǒng)一出口。 參考《第一行代碼java》《java程序設(shè)計(jì)教程》java中程序的錯(cuò)誤有語法錯(cuò)誤、語義錯(cuò)誤。如果是語法性錯(cuò)誤,在編譯時(shí)就可以檢查出來并解決。語義錯(cuò)誤是在程序運(yùn)行時(shí)出現(xiàn)的,在編譯時(shí)沒有錯(cuò)誤,但在運(yùn)行時(shí)可能會(huì)出現(xiàn)錯(cuò)誤導(dǎo)致程序退出,這些錯(cuò)誤稱為異常。在沒有異常處理的情況下,也即...
摘要:異常發(fā)生時(shí)如何處理,提供了解決辦法異常處理機(jī)制。只要在程序中產(chǎn)生了異常,就會(huì)用一個(gè)對(duì)應(yīng)類型的異常對(duì)象來封裝異常,會(huì)試圖尋找異常處理程序來處理異常。中,異常處理的任務(wù)就是將執(zhí)行控制流從異常發(fā)生的地方轉(zhuǎn)移到能夠處理這種異常的地方去。 前言 概述:異常就是java程序在運(yùn)行過程中出現(xiàn)的錯(cuò)誤。 異常發(fā)生時(shí)如何處理,java提供了解決辦法:異常處理機(jī)制。 java中的異常可以是函數(shù)中的語句執(zhí)行...
摘要:下面是異常處理機(jī)制的語法結(jié)構(gòu)業(yè)務(wù)實(shí)現(xiàn)代碼輸入不合法如果執(zhí)行塊里業(yè)務(wù)邏輯代碼時(shí)出現(xiàn)異常,系統(tǒng)自動(dòng)生成一個(gè)異常對(duì)象,該對(duì)象被提交給運(yùn)行時(shí)環(huán)境,這個(gè)過程被稱為拋出異常。 Java的異常機(jī)制主要依賴于try、catch、finally、throw和throws五個(gè)關(guān)鍵字, try關(guān)鍵字后緊跟一個(gè)花括號(hào)括起來的代碼塊(花括號(hào)不可省略),簡(jiǎn)稱try塊,它里面放置可能引發(fā)異常的代碼 catch后對(duì)...
捕獲和處理異常 本節(jié)描述如何使用三個(gè)異常處理程序組件 — try、catch和finally塊 — 來編寫異常處理程序,然后,解釋了Java SE 7中引入的try-with-resources語句,try-with-resources語句特別適用于使用Closeable資源的情況,例如流。 本節(jié)的最后一部分將介紹一個(gè)示例,并分析各種場(chǎng)景中發(fā)生的情況。 以下示例定義并實(shí)現(xiàn)名為L(zhǎng)istOfNumbe...
閱讀 797·2023-04-25 22:57
閱讀 3051·2021-11-23 10:03
閱讀 613·2021-11-22 15:24
閱讀 3156·2021-11-02 14:47
閱讀 2901·2021-09-10 11:23
閱讀 3115·2021-09-06 15:00
閱讀 3936·2019-08-30 15:56
閱讀 3322·2019-08-30 15:52