freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

基于java的異常處理技術(shù)及其應(yīng)用(編輯修改稿)

2024-12-22 20:29 本頁面
 

【文章內(nèi)容簡介】 owable類的 printStacktrace方法來獲得堆棧結(jié)構(gòu)的文本描敘。現(xiàn)在,可以通過調(diào)用 getStackTrace方法來獲得一個 StackTraceElement對象的數(shù)組,通過研究該數(shù)組,就可以分析程序運(yùn)行情況。例如: Throwable t = new Throwable ( )。 StackTraceElement[ ] frames = ( )。 For ( int i= 0。i。i++) 使用 StackTraceElement類提供的方法獲取文件名以及當(dāng)前執(zhí)行的代碼行行號的方法,同樣,它還提供獲取類名 、 方法名的方法。而 toString方法可以產(chǎn)生一個格式化字符串,其中包含那些獲得的信息。 以下程序 。 import .*。 import .*。 public class StackTest { /** 返回 n! = 1 * 2 * . . . * n 的結(jié)果 */ public static int factorial (int n) { (factorial ( + n + ): ) 。 Throwable t = new Throwable( )。 StackTraceElement[ ] frames = ()。 for ( int i = 0 。i 。 i++ ) ( frames[ i] )。 int r 。 if (n = 1) r = 1。 else r = n * factorial(n 1)。 // 遞歸調(diào)用 factorial()方法 (return + r)。 return r。 } 10 public static void main(String[] args) { String input = ( 請輸入一個整數(shù) : )。 int n =(input)。 factorial(n)。 ( 0 )。 //退出程序 } } 由于需要從標(biāo)準(zhǔn)輸入中獲取整數(shù)數(shù)字, (input)方法可能會產(chǎn)生。 運(yùn)行程序時界面: 圖 3- 1 輸入界面 如果我們要實(shí)現(xiàn)遞歸方法 factorial(3),通過 getStackTrace方法可以查看程序運(yùn)行的過程。其結(jié)果為如下: 圖 3- 2 遞歸方法 factorial(3)的輸出結(jié)果 而這個程序可能產(chǎn)生的一個異常是 NumberFormatException異常。當(dāng)異常產(chǎn)生后, JVM調(diào)用該異常處理。其運(yùn)行界面如下: 11 圖 3- 3 輸入一個產(chǎn)生 異常 的 數(shù)據(jù) 返回到控制臺的結(jié)果為描述該異常: 圖 3- 4 輸入異常數(shù)據(jù) 時在控制臺產(chǎn)生的結(jié)果 (四)自定義異常 由于在 Java 中 ,異常也被看成是對象 ,而且 異常 和一般的對象沒有什么不同。因此 ,任何類都可以定義它自己的異常 ,并用 throw 語句引發(fā)它們。其中 ,throw 語句由帶有一個對象的關(guān)鍵字 throw 組成 ,這個對象應(yīng)該是 Exception 或其子類的一個實(shí)體對象。要注意的是 ,當(dāng)執(zhí)行了一條 throw 語句后 ,就不會執(zhí)行該語句之后的任何代碼了。 通常每 個異常類提供一個默認(rèn)的構(gòu)造器以及一個包含詳細(xì)信息的構(gòu)造器。使用Throwable 的 toString 方法會輸出該詳細(xì)信息,這個方法對代碼調(diào) 試是很有用處。 例如 創(chuàng)建這樣的異常類: class FileFormatException extends IOException { public FileFormatException ( ) { } public FileFormatException ( ) { super ( gripe) 。 } 12 } String readData ( BufferedReader in ) throws FileFormatException { ?? while ( ?? ) { if ( ch==1) //EOF 標(biāo)記,即文件結(jié)尾 { if (nlen) throw new FileFormatException ( )。 //拋出自定義的異常類 FileFormatException } ?? } return s。 } (五)關(guān)于圖形界面程序的異常捕獲 對于一個非圖形界面的程序而言,如果一個異常沒有被捕獲,則程序會終止運(yùn)行并且在控制臺輸出一條包含異常類型以及堆棧內(nèi)容的信息。而對于具有圖形界面的程序(包含applet以及應(yīng)用程序),也會輸出這些錯誤信息,但是程序會返回用戶界面外層循環(huán)中去。 下面我們從一個有趣的程序 顏色調(diào)和板來討論圖形界面程序處理異常的情況。 在 (源代碼見附錄) 中,程序可以根據(jù)我們輸入紅色 、 綠色 、藍(lán)色( RGB) 、 亮度 、 飽和度 和 色度值來調(diào)節(jié)顏色。整個程序除了可能會產(chǎn)生RuntimeException異常外,這個程序還會產(chǎn)生 NumberFormatException異常。當(dāng)然這是已檢查型異常。 下面我們來看它在 JVM中的運(yùn)行情況: 圖 4- 1 輸入正常數(shù)據(jù)時的顏色調(diào)和板 13 當(dāng)我們改變 ”紅色 ”值為非法的一個輸入,比如: “AB”時,其運(yùn)行結(jié)果為如下: 圖 4- 2 輸入一個產(chǎn)生異常的數(shù)據(jù) 顏色未變化,好像程序發(fā)生邏輯錯誤似的(沒有按照我們希望的去運(yùn)行)其實(shí)程序已將控制權(quán)轉(zhuǎn)到控制中心去了,這個圖形還處于初始化階段(在輸入 “AB”前 )。在控制中心我們發(fā)現(xiàn)如下一些異常發(fā)生描述: 圖 4- 3 異常產(chǎn)生后返回到控制臺的說明 這說明發(fā)生了 NumberFormatException(數(shù)字格式異常)異常后,并沒有繼續(xù)往下執(zhí)行代碼。由于數(shù)字格式異常為已檢查型異常,直接調(diào)用系統(tǒng)的方法處理了。 JVM報告程序發(fā)生了數(shù)字格式異常產(chǎn)生,并將其具體的情況報告給用戶。但是,是不是這個程序不能再接受正常的輸入數(shù)據(jù)運(yùn)行呢?還是必須要重新啟動才能運(yùn)行? 我們將 “紅色 ”值由 “AB”改為 “200”后發(fā)現(xiàn)顏色改變,這說明該程序還能運(yùn)行。結(jié)果如下圖: 圖 4- 4 將產(chǎn)生異常的輸入數(shù)據(jù)更改后的顏色調(diào)和板 可見當(dāng)輸入了正常的數(shù)據(jù)后,程序就像第一次運(yùn)行一樣,可以正確的顯示顏色了。我 14 們得到的結(jié)論是:部分 Java圖形界面程序發(fā)生異常后不需要重新初始化,依舊可以運(yùn)行,但必須不再有異常發(fā)生。 五 Java 異常處理 基本原則 合理使用 Java異常機(jī)制可以使程序健壯而清晰 ,但是 ,Java異常處理機(jī)制 也 常常 會 被錯誤 地 使用 ,下面就討論一些關(guān)于 使用異常 的 原則 : (一 )不要忽略 已檢查型異常 注意 下面的代碼 : try { method1()。 //method1拋出 Exception A } catch(Exception A) //捕獲 Exception A { ( )。 //打印捕獲異常 } 上面的代碼似乎沒有什么問題 ,捕獲異常后將異常打印 ,然后繼續(xù)執(zhí)行。事實(shí)上在 catch塊中對發(fā)生的異常情況并沒有作任何處理。雖然程序能夠繼續(xù)執(zhí)行 ,但是由于這里的操作已經(jīng)發(fā)生異常 ,將會導(dǎo)致以后的操作不能按照預(yù)期的情況發(fā)展下去 ,可能導(dǎo)致兩個結(jié)果 。 一種情況是這里的異常導(dǎo)致在程序中別的地方拋出一個異常 ,這會使程序 員在調(diào)試時感到迷惑 ,因?yàn)樾碌漠惓伋龅牡胤讲⒉皇浅绦蛘嬲l(fā)生問題的地方 ,也不是發(fā)生問題的真正原因 。 另外一種情況程序繼續(xù)運(yùn)行 ,并得出一個錯誤的輸出結(jié)果 ,這種問題更加難以捕捉 ,因?yàn)楹芸赡馨阉?dāng)成一個正確的輸出。 那么應(yīng)該如何處理呢 ? 一般 有四個選擇 :處理異常 ,進(jìn)行修復(fù)以讓程序繼續(xù)執(zhí)行 。重新拋出異常 ,在對異常進(jìn)行分析后發(fā)現(xiàn)這里不能處理它 ,那么重新拋出異常 ,讓調(diào)用者處理 。將異常轉(zhuǎn)換為用戶可以理解的自定義異常再拋出 ,這時應(yīng)該注意不要丟失原 始異常信息 。不要捕獲異常。 因此 ,當(dāng)捕獲一個 未檢查型異常 時 ,必須對異常進(jìn)行處理 。如果認(rèn)為不必要在這里作處理 ,就不要捕獲該異常 ,在方法體中聲明方法拋出異常 ,由上層調(diào)用者來處理該異常。 15 (二 )不要一次捕獲所有的異常 我們常見如下關(guān)于異常處理的代碼 : try { method1()。 //method1拋出 ExceptionA method2()。 //method2拋出 ExceptionB method3()。 //method3拋出 ExceptionC } catch(Exception e) //捕獲所有異常 { ?? } 代碼中使用一個 catch子句捕獲了所有異常 ,看上去很簡潔 ,一個代碼段就捕獲了全部的異常。但是這里有兩個潛在的缺陷 ,一是對 try塊中拋出的每種 異常 ,很可能需要不同的處理和恢復(fù)措施 ,而由于這里只有一個 catch塊 ,分別處理就不能實(shí)現(xiàn)。二是 try塊中還可能拋出 RuntimeException,代碼中
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評公示相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1