摘要:因?yàn)槭怯商摂M機(jī)自動(dòng)拋出并自動(dòng)捕獲,所以又叫非檢查異常。多異常捕獲在之前,對(duì)多種的異常只能使用多個(gè)來(lái)進(jìn)行捕獲。注意多種異常類型之間用豎線隔開。多重塊后面,最好再有個(gè)塊用來(lái)捕獲異常,防止遺漏。期待自己的異常進(jìn)階。
異常的體系機(jī)構(gòu)
Java提供了豐富的異常類,而這些異常類之間又有這嚴(yán)格的繼承關(guān)系。下面讓我們看一下Java中異常的體系結(jié)構(gòu)。
首先,Java將所有的不正常情況分為兩種,一種是錯(cuò)誤(Error),另一種就是我們所說(shuō)的異常(Exception)。
Error錯(cuò)誤是我發(fā)恢復(fù),不能獲取的,如系統(tǒng)崩潰,虛擬機(jī)錯(cuò)誤,動(dòng)態(tài)鏈接失敗等。這會(huì)導(dǎo)致程序直接中斷。
Exception是我們常說(shuō)的異常,他又大致分為兩類,一類是運(yùn)行時(shí)異常:RuntimeException,另一類就是其他異常。因?yàn)?b>RuntimeException是由Java虛擬機(jī)自動(dòng)拋出并自動(dòng)捕獲,所以又叫非檢查異常。而另一類異常就不一樣了,需要我們手動(dòng)的捕獲和處理異常,所以叫做檢查異常。
異常的捕獲介紹了異常的大概情況,下面我們啊來(lái)說(shuō)說(shuō)如何捕獲處理異常。
try...catch...首先,我們先想一下,如果沒(méi)有我們使用最原始的解決異常是個(gè)什么辦法:
if (異常1) { 處理 } else if (異常2) { 處理 } else { 處理 }
沒(méi)錯(cuò),就是一大長(zhǎng)串的if...else,對(duì)每種異常情況進(jìn)行處理。所以這時(shí)我們就希望有一種更加強(qiáng)大的if塊,可以一下子表示所有的異常情況然后處理掉。這就有了我們的try...catch。
try { // 業(yè)務(wù)實(shí)現(xiàn)代碼 ... } catch (Exception e) { // 對(duì)異常的處理 }
如果try塊里的業(yè)務(wù)邏輯代碼出現(xiàn)了異常,系統(tǒng)就會(huì)生成一個(gè)異常對(duì)象,然后將該對(duì)象提交給Java運(yùn)行時(shí)環(huán)境(throw),接著查找catch塊,如果找到了合適的catch塊,就將該異常對(duì)象交由該catch塊處理。這個(gè)過(guò)程又叫做捕獲(catch)異常;如果找不到合適的catch塊,程序?qū)⑼顺觥?/p> 多異常捕獲
在Java7之前,對(duì)多種的異常只能使用多個(gè)catch來(lái)進(jìn)行捕獲。
try { // 業(yè)務(wù)實(shí)現(xiàn)代碼 ... } catch (Exception1 e1) { ... } catch (Exception2 e2) { ... } catch (Exception3 e3) { ... }
但是從Java7開始,多個(gè)異??梢允褂?b>同一個(gè)catch來(lái)捕獲。
注意:
1.多種異常類型之間用豎線“|”隔開。finally回收資源
2.異常變量有隱式final修飾,因此不能對(duì)異常變量重新賦值。
3.父類異常要在子類異常以后捕獲。
finally,最終的,也就是我們處理完異常最后要做的事情。由于有時(shí)候我們會(huì)在try塊里面使用一些資源,這些資源最后也就在finally塊里被回收掉了。
try { // 業(yè)務(wù)實(shí)現(xiàn)代碼 } catch (Exception e) { // 異常處理 } finally { // 資源回收 }
當(dāng)然了,如果你說(shuō)我沒(méi)有使用資源,不想在finally塊里做資源回收的操作,也是可以的。
異常鏈首先說(shuō)說(shuō)為什么會(huì)有異常鏈這種東西。因?yàn)閷?duì)于一個(gè)完整的應(yīng)用而言,都是有比較嚴(yán)格的分層關(guān)系的,上層依賴下層的API。而對(duì)于用戶而言,我們不想看到底層的SQL異常,同時(shí)也會(huì)使得系統(tǒng)不安全。所以這時(shí)我們就要將底層的異常捕獲,然后再拋出一個(gè)新的業(yè)務(wù)異常,就可以在新的異常中給出用戶比較友好的提示信息。
try { // 業(yè)務(wù)邏輯的實(shí)現(xiàn) } catch (SQLException e) { // 記錄原始異常 ... // 拋出新的異常 throw new AnotherException("訪問(wèn)數(shù)據(jù)庫(kù)出現(xiàn)異常"); }
或者我們也可以這樣處理異常:
try { // 業(yè)務(wù)邏輯的實(shí)現(xiàn) } catch (SQLException ex) { // 記錄原始異常 ... // 拋出新的異常 throw new AnotherException(ex); }
這是由于Throwable基類有了一個(gè)可以接受Exception參數(shù)的方法。
總結(jié)對(duì)于異常的了解,我還處于入門階段,雖然平時(shí)的項(xiàng)目中也會(huì)遇到各種各樣的異常,然后解決異常,但是也只能說(shuō)是對(duì)異常有了一個(gè)了解。這里也是總結(jié)一下前人對(duì)于異常的經(jīng)驗(yàn)吧。
1.不要過(guò)多的使用try...catch,盡量使用邏輯去規(guī)避異常。
2.多重catch塊后面,最好再有個(gè)catch塊用來(lái)捕獲Exception異常,防止遺漏。
3.盡量去處理異常,不要只是簡(jiǎn)單的使用printStackTrace()打印異常。
相信隨著編程經(jīng)歷的豐富,我對(duì)于異常的理解也會(huì)有更進(jìn)一步的提升。期待自己的Java 異常進(jìn)階。
友情鏈接:https://www.imooc.com/learn/110
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/76747.html
摘要:異常發(fā)生時(shí)如何處理,提供了解決辦法異常處理機(jī)制。只要在程序中產(chǎn)生了異常,就會(huì)用一個(gè)對(duì)應(yīng)類型的異常對(duì)象來(lái)封裝異常,會(huì)試圖尋找異常處理程序來(lái)處理異常。中,異常處理的任務(wù)就是將執(zhí)行控制流從異常發(fā)生的地方轉(zhuǎn)移到能夠處理這種異常的地方去。 前言 概述:異常就是java程序在運(yùn)行過(guò)程中出現(xiàn)的錯(cuò)誤。 異常發(fā)生時(shí)如何處理,java提供了解決辦法:異常處理機(jī)制。 java中的異??梢允呛瘮?shù)中的語(yǔ)句執(zhí)行...
摘要:系列博文目錄編程思想學(xué)習(xí)錄連載之一切都是對(duì)象編程思想學(xué)習(xí)錄連載之初始化與清理編程思想學(xué)習(xí)錄連載之內(nèi)部類編程思想學(xué)習(xí)錄連載之異常本篇文章將講述關(guān)于異常的相關(guān)知識(shí)注本文首發(fā)于公眾號(hào),可長(zhǎng)按或掃描下面的小心心來(lái)訂閱基本概念使用異常來(lái)提供一致性的錯(cuò) showImg(https://segmentfault.com/img/remote/1460000013228854); Thinking ...
摘要:阻止當(dāng)前方法或作用域的,稱為異常。一非檢查異常和,以及她們的子類。強(qiáng)制要求對(duì)這類異常做預(yù)備處理使用或者。這樣的異常一般是由程序的運(yùn)行環(huán)境導(dǎo)致的。后跟的是異常對(duì)象,或者異常對(duì)象的引用。 異常 什么是異常 相異與常態(tài),和正常情況下不一致,有錯(cuò)誤出現(xiàn)。 阻止當(dāng)前方法或作用域的,稱為異常。 異常分類 showImg(https://segmentfault.com/img/bVbfpnY?w=...
摘要:請(qǐng)注意,我們?cè)诹牧膯卧獪y(cè)試遇到問(wèn)題多思考多查閱多驗(yàn)證,方能有所得,再勤快點(diǎn)樂(lè)于分享,才能寫出好文章。單元測(cè)試是指對(duì)軟件中的最小可測(cè)試單元進(jìn)行檢查和驗(yàn)證。 JAVA容器-自問(wèn)自答學(xué)HashMap 這次我和大家一起學(xué)習(xí)HashMap,HashMap我們?cè)诠ぷ髦薪?jīng)常會(huì)使用,而且面試中也很頻繁會(huì)問(wèn)到,因?yàn)樗锩嫣N(yùn)含著很多知識(shí)點(diǎn),可以很好的考察個(gè)人基礎(chǔ)。但一個(gè)這么重要的東西,我為什么沒(méi)有在一開始...
摘要:允許存在多個(gè),用于針對(duì)不同的異常做不同的處理。表示程序可能需要捕獲并且處理的異常。因此,我們應(yīng)該盡可能的避免通過(guò)異常來(lái)處理正常的邏輯檢查,這樣可以確保不會(huì)因?yàn)榘l(fā)生異常而導(dǎo)致性能問(wèn)題。異常表中的每一條記錄,都代表了一個(gè)異常處理器。 showImg(https://segmentfault.com/img/remote/1460000017918154?w=640&h=100); show...
閱讀 2233·2023-04-25 17:57
閱讀 1345·2021-11-24 09:39
閱讀 2556·2019-08-29 16:39
閱讀 3382·2019-08-29 13:44
閱讀 3233·2019-08-29 13:14
閱讀 2402·2019-08-26 11:36
閱讀 3909·2019-08-26 11:00
閱讀 987·2019-08-26 10:14