摘要:異常體系首先,標(biāo)志這是一個(gè)異常。區(qū)分這兩類異常主要特性是是否受檢。運(yùn)行時(shí)異常雖然可以不進(jìn)行處理,但是可能導(dǎo)致線程終止或者應(yīng)用終止。
在使用JdbcTemplate中queryForObject方法的時(shí)候拋出一個(gè)異常:
org.springframework.dao.EmptyResultDataAccessException: Incorrect result size: expected 1, actual 0
queryForObject的內(nèi)部邏輯是這樣的:使用queryForObject時(shí),會(huì)查詢一個(gè)結(jié)果,當(dāng)查詢中結(jié)果多余一個(gè)或者沒(méi)有都會(huì)拋出一個(gè)異常IncorrectResultSizeDataAccessException。這個(gè)向外拋出的異常為什么不需要我使用try-catch處理或者繼續(xù)向外拋出呢?下面的圖片展示這個(gè)異常的繼承結(jié)構(gòu)。
Google之后認(rèn)識(shí)到所有運(yùn)行時(shí)異常都可以不向外拋出。為了更加快速的解決問(wèn)題,決定對(duì)Java異常進(jìn)行更深入的學(xué)習(xí)。
Java異常體系
首先,Throwable標(biāo)志這是一個(gè)異常。
其次,Throwable有兩個(gè)子類分別是Error和Exception,Error表示的是JVM發(fā)生的異常,如內(nèi)存溢出,這是應(yīng)用自身程序本身無(wú)法處理的異常;而Exception則表示應(yīng)用程序自身可以處理的異常。
最后,Exception的子類分為兩類,一個(gè)是RuntimeException,另外就是其他繼承自Exception的異常,如IOException。區(qū)分這兩類異常主要特性是是否受檢。
什么是受檢異常,什么是非受檢異常? 本質(zhì)上,受檢異常指的是會(huì)受到Java 編譯器檢測(cè)的異常,也就是說(shuō)當(dāng)你的一個(gè)方法中有拋出一個(gè)受檢異常時(shí), 你必須對(duì)它進(jìn)行處理,使用try-catch或者向上拋出進(jìn)行處理。非受檢異常指的是不會(huì)受到Java編譯器檢測(cè)的異常, 當(dāng)你的一個(gè)方法中拋出了非受檢異常時(shí),你不需要進(jìn)行處理。 ?。剩幔觯嵋鈭D上使用非受檢異常來(lái)表示由于軟件開發(fā)人員導(dǎo)致的錯(cuò)誤,如NullPointerException;而使用 受檢異常來(lái)表示一些用戶誤操作的錯(cuò)誤,如IOException?!癟he Java Tutorial”告訴我們通常情況下我們 應(yīng)該拋出受檢異常,而不要拋出非受檢異常。 想一想,如果是來(lái)自外部的數(shù)據(jù)有錯(cuò)誤,我們可以拋出異常來(lái)說(shuō)明用戶傳入的參數(shù)有錯(cuò)誤;而如果是開發(fā)人員導(dǎo)致的 錯(cuò)誤,且我們開發(fā)人員自己都知道自己的代碼有異常,那直接改正不久好了,干嘛還要向外拋出呢!所以通常是不會(huì) 繼承非受檢異常的。
運(yùn)行時(shí)異常雖然可以不進(jìn)行處理,但是可能導(dǎo)致線程終止或者應(yīng)用終止。如果是非主線程,則由Thread.run()拋出異常后,線程終止。如果是主線程(即main方法)拋出異常,則應(yīng)用終止。
有興趣可以將下面的代碼復(fù)制到編譯器中來(lái)檢測(cè)受檢異常和非受檢異常。
public class Main { public void caller() { callee(); } public void callee() throws Exception{ throw new Exception(); } }
上面的代碼中在調(diào)用callee方法的時(shí)候?qū)⒕幾g不過(guò)。
public class Main { public void caller() { callee(); } public void callee(){ throw new RuntimeException(); } }
上面的代碼將不會(huì)有任何告警。
參考:
Java 的 Checked 和 Unchecked Exception【譯】
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/74786.html
摘要:不過(guò)按照經(jīng)驗(yàn)來(lái)說(shuō),這類異常要么盡量避免,要么出現(xiàn)了就要做異常處理,從而保證程序的健壯性。業(yè)務(wù)是千變?nèi)f化,但是它們可能產(chǎn)生的異常處理方式是不會(huì)變化的,按照這個(gè)思路去做異常處理即可。 前言:說(shuō)到異常體系,可能對(duì)于一些初入職場(chǎng)的老鐵會(huì)很頭痛,不能夠很清晰的描述異常是個(gè)什么情況。那么本文將通過(guò)打流水仗的方式給大家介紹一下工作中涉及的異常知識(shí)。首先能看到本文,說(shuō)明也對(duì)異常是有了解的,所以文章開頭...
摘要:案例演示該句運(yùn)行時(shí)發(fā)生了數(shù)組索引越界異常,由于沒(méi)有處理異常,導(dǎo)致程序無(wú)法繼續(xù)執(zhí)行,程序結(jié)束。用來(lái)進(jìn)行某種異常的捕獲,實(shí)現(xiàn)對(duì)捕獲到的異常進(jìn)行處理。運(yùn)行時(shí)期異常一旦發(fā)生需要程序人員修改源代碼。 01異常的概述 * A: 異常的概述 * a:什么是異常 * Java代碼在運(yùn)行時(shí)期發(fā)生的問(wèn)題就是異常。 * b:異常類 * 在Java中,把異常信息...
摘要:異常,可以有針對(duì)性的處理方式無(wú)論是錯(cuò)誤還是異常,它們都有具體的子類體現(xiàn)每一個(gè)問(wèn)題,它們的子類都有一個(gè)共性,就是都以父類名才作為子類的后綴名。特殊情況對(duì)應(yīng)多個(gè)時(shí),如果有父類的語(yǔ)句塊,一定要放在下面。聲明的原因是需要調(diào)用者對(duì)該異常進(jìn)行處理。 異 常:★★★★異常:就是不正常。程序在運(yùn)行時(shí)出現(xiàn)的不正常情況。其實(shí)就是程序中出現(xiàn)的問(wèn)題。這個(gè)問(wèn)題按照面向?qū)ο笏枷脒M(jìn)行描述,并封裝成了對(duì)象。因?yàn)閱?wèn)題的...
摘要:因?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)。 showImg(https://segmentfau...
閱讀 921·2023-04-25 18:51
閱讀 1875·2021-09-09 11:39
閱讀 3285·2019-08-30 15:53
閱讀 2104·2019-08-30 13:03
閱讀 1314·2019-08-29 16:17
閱讀 587·2019-08-29 11:33
閱讀 1888·2019-08-26 14:00
閱讀 2126·2019-08-26 13:41