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