java 异常处理机制(java 编程思想)
一、概念
- “異常”這個(gè)詞有“我對(duì)此感到意外”的意思。問(wèn)題出現(xiàn)了,你也許并不清楚該如何處理,但你的確知道不應(yīng)該置之不理;你要停下來(lái),看看是不是有別人或在別的地方,能夠處理這個(gè)問(wèn)題。只是在當(dāng)前的環(huán)境中還沒(méi)有足夠的信息來(lái)解決這個(gè)問(wèn)題,所以就把這個(gè)問(wèn)題提交到一個(gè)更高級(jí)別的環(huán)境中,在這里將作出正確的決定。
二、基本知識(shí)
2.1 基本異常
- 當(dāng)拋出異常后,首先,同Java中其它的對(duì)象創(chuàng)建一樣,將使用 new在堆上創(chuàng)建異常對(duì)象。然后,當(dāng)前的執(zhí)行路徑(它不能繼續(xù)下去了)被終止,并且從當(dāng)前環(huán)境中彈出對(duì)異常對(duì)象的引用。此時(shí),異常處理機(jī)制接管程序,并開始尋找一個(gè)恰當(dāng)?shù)牡胤絹?lái)繼續(xù)執(zhí)行程序。這個(gè)恰當(dāng)?shù)牡胤骄褪钱惓L幚沓绦?#xff0c;它的任務(wù)是將程序從錯(cuò)誤狀態(tài)中恢復(fù),以使程序能要么換一種方式運(yùn)行,要么繼續(xù)運(yùn)行下去。異常允許我們(如果沒(méi)有其它手段)強(qiáng)制程序停止運(yùn)行,并告訴我們出現(xiàn)了什么問(wèn)題,或者(理想狀態(tài)下)強(qiáng)制程序處理問(wèn)題,并返回到穩(wěn)定狀態(tài)。
在基本異常的基礎(chǔ)之上,我們還需要知道異常的參數(shù):
- 我們總是用 new 在堆上創(chuàng)建異常對(duì)象,這也伴隨著存儲(chǔ)空間的分配和構(gòu)造器的調(diào)用。所有標(biāo)準(zhǔn)異常類都有兩個(gè)構(gòu)造器:一個(gè)是默認(rèn)構(gòu)造器;另一個(gè)是接受字符串作為參數(shù),以便能把相關(guān)信息放入異常對(duì)象的構(gòu)造器:?
throw new NullpointerException("t = null ");?
- 在使用 new 創(chuàng)建異常對(duì)象之后,此對(duì)象的引用將傳給 throw。將會(huì)返回一個(gè)異常對(duì)象然后退出方法或作用域。
- 能夠拋出任意類型的Throwable對(duì)象,它是異常類型的根類。通常,對(duì)于不同類型的錯(cuò)誤,要拋出相應(yīng)的異常。錯(cuò)誤信息可以保存在異常對(duì)象內(nèi)部或者使用異常類的名稱來(lái)暗示。上一層環(huán)境通過(guò)這些信息來(lái)決定如何處理異常。(通常,異常對(duì)象中僅有的信息就是異常類型,除此之外不包含任何有意義的內(nèi)容。)
2.2 捕獲異常
try 塊捕獲異常
如果在方法內(nèi)部拋出了異常(或者在方法內(nèi)部調(diào)用的其他方法拋出了異常),這個(gè)方法將在拋出異常的過(guò)程中結(jié)束。要是不希望方法就此結(jié)束,可以在方法內(nèi)設(shè)置一個(gè)特殊的塊來(lái)捕獲異常。
catch塊處理異常
當(dāng)然,拋出的異常必須在某處得到處理。這個(gè)“地點(diǎn)”就是異常處理程序,而且針對(duì)每個(gè)要捕獲的異常,得準(zhǔn)備相應(yīng)的處理程序。異常處理程序緊跟在 try 塊之后,以關(guān)鍵字 catch 表示:
try{//Code that might generate exceptions }catch(Type1 id1){//handle exceptions of Type1 }catch(Type2 id2){//handle exceptions of Type2 } //etc...異常處理程序必須緊跟在 try 塊之后。當(dāng)異常被拋出時(shí),異常處理機(jī)制將負(fù)責(zé)搜尋參數(shù)與異常類型相匹配的第一個(gè)處理程序。然后進(jìn)入 catch 子句執(zhí)行,此時(shí)認(rèn)為異常得到了處理。一旦 catch 子句結(jié)束,則處理程序的查找過(guò)程結(jié)束。注意,只有匹配的 catch 子句才能得到執(zhí)行。
兩種異常處理模型: 終止模型、恢復(fù)模型
終止模型: 一旦異常被拋出,就表明錯(cuò)誤已經(jīng)無(wú)法挽回,也不能回來(lái)繼續(xù)執(zhí)行。
恢復(fù)模型: 異常處理程序的工作是修正錯(cuò)誤,然后重新嘗試調(diào)出問(wèn)題的方法,并認(rèn)為第二次能成功。 該種模型時(shí),不能再遇見(jiàn)錯(cuò)誤時(shí)就拋出異常,而是調(diào)用方法來(lái)修正,或者把try塊放在while循環(huán)里,這樣不斷的進(jìn)入try塊直到得到滿意的結(jié)果。
2.3 創(chuàng)建自定義異常
通過(guò)自定義MyException繼承自Exception來(lái)創(chuàng)建自定義的異常。
class MyException extends Exception{public MyException(){}public MyException(String in){super(in);} }并在catch中通過(guò):
e.printStackTrace()
將異常寫入到System.err(標(biāo)準(zhǔn)錯(cuò)誤流),在debug的時(shí)候會(huì)顯示錯(cuò)誤的函數(shù)和行號(hào)(這是對(duì)System.out的優(yōu)勢(shì))。
(它將打印“從方法調(diào)用處直到異常拋出處”的方法調(diào)用序列)
棧軌跡:
printStackTrace方法也可以通過(guò)getStackTrace()方法來(lái)訪問(wèn),這個(gè)方法將返回一個(gè)由棧軌跡中的元素構(gòu)成的數(shù)組,其中每一個(gè)元素都將表示棧中的一幀。
元素0是棧頂元素,并且是調(diào)用序列中的最后一個(gè)方法調(diào)用。
通過(guò)如下代碼打印 棧軌跡:
try {f();} catch (MyException e) {// e.printStackTrace();for(StackTraceElement ste : e.getStackTrace()){Log.d(TAG, "onClick: "+ste.getMethodName());}}得到的結(jié)果如下:
?
2.4 異常說(shuō)明
如果調(diào)用某個(gè)方法,方法里的代碼產(chǎn)生了異常卻沒(méi)有進(jìn)行處理,編譯器會(huì)發(fā)現(xiàn)這個(gè)問(wèn)題: 要么處理這個(gè)異常,要么在函數(shù)異常說(shuō)明中表明此方法將產(chǎn)生異常。
如下圖所示: 1、函數(shù)聲明加: throws MyException? ? 2、函數(shù)中 增加 try catch 處理異常。?
2.5 try catch中有return,final?
當(dāng)try/catch代碼中有return語(yǔ)句,那么此時(shí)的final是否還會(huì)繼續(xù)執(zhí)行?
? ? ? ?1、 當(dāng)try catch中有return 語(yǔ)句,在執(zhí)行return之前將需要return的結(jié)果保存在一個(gè)臨時(shí)變量中,然后去執(zhí)行finally代碼塊,執(zhí)行完之后再執(zhí)行return。
? ? ? ?2、 1中情況有個(gè)前提條件是finally中沒(méi)有return語(yǔ)句,如果finally代碼塊中也有return,那么會(huì)執(zhí)行finally中的return,不會(huì)執(zhí)行try/catch中的。
int testFinallyReturn(){int x = 1;try{x++;return x;}catch (Exception e){return x;}finally {++x;return x;}}運(yùn)行結(jié)果:
if(exist("return x") in finally){
return result : 2 ;
}else{
return result : 3 ;
}
轉(zhuǎn)載于:https://www.cnblogs.com/NeilZhang/p/7639546.html
總結(jié)
以上是生活随笔為你收集整理的java 异常处理机制(java 编程思想)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 几种常见的JS混淆工具比较。
- 下一篇: 软件构造随笔三