畢業設計-基于java的異常處理技術及其應用_第1頁
畢業設計-基于java的異常處理技術及其應用_第2頁
畢業設計-基于java的異常處理技術及其應用_第3頁
畢業設計-基于java的異常處理技術及其應用_第4頁
畢業設計-基于java的異常處理技術及其應用_第5頁
已閱讀5頁,還剩22頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、目 錄 TOC o 1-3 h z u HYPERLINK l _Toc105574582 一 引言 PAGEREF _Toc105574582 h 1 HYPERLINK l _Toc105574583 二 關于JDK和Java異常 PAGEREF _Toc105574583 h 2 HYPERLINK l _Toc105574584 一Java異常定義 PAGEREF _Toc105574584 h 2 HYPERLINK l _Toc105574585 二Java中的異常類 PAGEREF _Toc105574585 h 2 HYPERLINK l _Toc105574586 三Java

2、語言標準對異常處理的要求 PAGEREF _Toc105574586 h 4 HYPERLINK l _Toc105574587 三 Java異常的處理機制 PAGEREF _Toc105574587 h 4 HYPERLINK l _Toc105574588 一Java異常處理機制具體實現 PAGEREF _Toc105574588 h 4 HYPERLINK l _Toc105574589 二Java中異常發生的原因 PAGEREF _Toc105574589 h 6 HYPERLINK l _Toc105574590 三Java異常處理的優點 PAGEREF _Toc105574590

3、h 6 HYPERLINK l _Toc105574591 四 Java異常處理技術及其應用 PAGEREF _Toc105574591 h 8 HYPERLINK l _Toc105574592 一拋出異常 PAGEREF _Toc105574592 h 8 HYPERLINK l _Toc105574593 二捕獲異常 PAGEREF _Toc105574593 h 8 HYPERLINK l _Toc105574594 三堆棧幀 PAGEREF _Toc105574594 h 9 HYPERLINK l _Toc105574595 四自定義異常 PAGEREF _Toc105574595

4、 h 11 HYPERLINK l _Toc105574596 五關于圖形界面程序的異常捕獲 PAGEREF _Toc105574596 h 12 HYPERLINK l _Toc105574597 五 Java異常處理根本原那么 PAGEREF _Toc105574597 h 14 HYPERLINK l _Toc105574598 (一)不要忽略已檢查型異常 PAGEREF _Toc105574598 h 14 HYPERLINK l _Toc105574599 (二)不要一次捕獲所有的異常 PAGEREF _Toc105574599 h 15 HYPERLINK l _Toc105574

5、600 (三)使用finally塊釋放資源 PAGEREF _Toc105574600 h 16 HYPERLINK l _Toc105574601 (四)異常不能影響對象的狀態 PAGEREF _Toc105574601 h 17 HYPERLINK l _Toc105574602 (五)注意喪失或忽略的異常 PAGEREF _Toc105574602 h 17 HYPERLINK l _Toc105574603 (六)不要同時使用異常機制和返回值來處理異常 PAGEREF _Toc105574603 h 20 HYPERLINK l _Toc105574604 (七)不要讓try塊過于龐大

6、 PAGEREF _Toc105574604 h 21 HYPERLINK l _Toc105574605 六 結束語 PAGEREF _Toc105574605 h 21 HYPERLINK l _Toc105574606 致謝 PAGEREF _Toc105574606 h 21 HYPERLINK l _Toc105574607 參考文獻 PAGEREF _Toc105574607 h 22 HYPERLINK l _Toc105574608 附錄、源代碼 PAGEREF _Toc105574608 h 22基于Java的異常處理技術及其應用摘 要 本文以Java軟件開發工具箱作為環境,

7、通過與一些編程語言的錯誤處理相比擬,介紹了Java中異常處理技術的由來、定義、標準和Java內建的異常類,討論了Java中異常產生的原因、實現,還對Java異常處理機制的優點進行了簡述,就Java異常處理技術從拋出異常、捕獲異常、堆棧幀、自定義異常、圖形界面程序異常捕獲五個方面進行了討論。本文還就Java異常處理技術的應用做了一些探討,試圖從軟件開發者的角度說明Java異常處理技術在開發中一些有價值的應用。關鍵詞 Java語言 Java異常處理 JVM 一 引言在程序設計中,盡管編寫檢查和處理錯誤的程序代碼很乏味,并且它們使程序源代碼顯得冗長,但是,錯誤檢測和處理仍是任何健壯應用程序最重要的組

8、成局部之一。傳統的異常處理多采用返回值來標識程序中出現的異常情況,這是程序員熟悉的一種方式,但卻有很多缺點。首先,一個APIApplication Programming Interface 應用編程接口可以返回任意的返回值,而這些返回值本身并不能解釋是否代表一個異常情況發生或者發生異常的具體情況,需要調用API的程序自己判斷并解釋返回值的含義。其次,它并沒有一種機制來保證異常情況一定會得到處理,調用程序可以簡單地忽略該返回值,從而需要調用API的程序員記住去檢測返回值并處理異常情況。這種方式還讓程序代碼變得晦澀冗長, 當進行容易出現異常情況的處理時,比方:I/O操作,程序中會出現很大的局部用

9、于處理異常情況的switch分支,程序代碼的可讀性變得很差。相對于傳統異常處理方式的缺點,Java異常處理機制提供了很好的解決方案。Java異常處理使開發人員不用編寫特殊代碼檢測返回值就能夠很容易地檢測錯誤,并且把異常處理代碼和異常產生代碼明確地分開,通過拋出Java預定義或者自定義的異常,能夠說明程序中出現了什么樣的異常情況1;而且Java的語言機制保證了異常一定會得到恰當的處理,合理地使用異常處理機制,會讓程序代碼更清晰。 二 關于JDK和Java異常一Java異常定義 早期的編程語言比方C語言沒有異常處理,通常是遇到錯誤返回一個特殊的值或設定一個標志,并以此判斷是不是有錯誤產生。隨著系統

10、規模的不斷擴大,這種錯誤處理已經成為創立大型可維護程序的障礙了。于是在一些語言中出現了異常處理機制,比方在Basic中的異常處理語句“on error goto,而Java那么是在C+根底上建立了新的異常處理機制。Java通過面向對象的方法進行異常處理,把各種不同的異常進行分類,并提供了良好的接口。這種機制為復雜程序提供了強有力的控制方式。同時這些異常代碼與“常規代碼別離,增強了程序的可讀性,編寫程序時也顯得更靈活。 在編譯時沒有問題的Java源程序,在運行期可能還會發生錯誤,這種錯誤就稱為異常Exception。異常也可認為是程序運行過程中違背正常指令流而產生的事件2。二Java中的異常類在

11、Java中,所有的異常都是以類對象的形式存在的。每個異常都是Throwable類或其子類的實例。當一個方法出現異常后便拋出一個異常對象,該對象中包含有異常信息,調用這個對象的方法可以捕獲到這個異常并進行處理3。Throwable是所有異常的基類,程序中一般不會直接拋出Throwable對象,Exception和Error是Throwable的子類,Exception下面又有RuntimeException和一般的Exception兩類。可以把Java異常分為三類:第一類是Error,Error表示程序在運行期間出現了十分嚴重、不可恢復的錯誤,在這種情況下應用程序只能終止運行,例如Java虛擬機

12、JVM出現錯誤。在EJBEnterprise JavaBean中將此類歸為JVM 異常,這種類型的異常由 JVM 拋出。Error是一種uncheckedException未檢查型異常,編譯器不會檢查Error是否被處理,在程序中不用捕獲Error類型的異常;一般情況下,在程序中也不應該拋出Error類型的異常。第二類是RuntimeException,在EJB也稱為系統異常。RuntimeException是一種未檢查型異常,即表示編譯器不會檢查程序是否對RuntimeException作了處理,在程序中不必捕獲未檢查型異常,也不必在方法體聲明拋出RuntimeException類。Runt

13、imeException發生的時候,表示程序中出現了編程錯誤,所以應該找出錯誤修改程序,而不是去捕獲RuntimeException。ThrowableErrorExceptionRuntimeExceptionIOException 圖21 Java異常類層次圖第三類是一般的checkedException, 即已檢查型異常。在EJB中稱為應用程序異常。已檢查型異常是在編程中使用最多的異常,所有繼承自Exception并且不是RuntimeException的異常都是已檢查型異常,如圖2-1中為Java異常的類層次圖。都聲明有標準異常類。這些異常類以未檢查型異常類和已檢查型異常類可分為如下:

14、已檢查型異常類主要有:1在java.lang中:ClassNotFoundException:指定名字的類或接口沒有被發現。CloneNotSupportedException:克隆一個沒有實現Cloneable接口的類。IllegalAccessException:試圖使用給出了完全路徑信息的字符串加載一個類,但當前正在執行的方法無法訪問指定的類,原因是該類不是public類或是在另一個包中。InstantiationException:試圖使用Class的newInstance方法創立一個對象實例,但是,指定的對象沒有被實例化,因為它是一個接口、抽象類或者一個數組。InterruptedE

15、xception:當前的線程正在等待,而另一個線程那么使用了Thread的interrupt方法中斷了當前線程。2在Java.io中:IOException:申請I/O操作沒有成功。EOFException:在輸入操作正常結束前遇到了文件結束符。FileNotFoundException:在文件系統中,沒有找到由文件名字符串指定的文件。InterruptedIOException當前線程正在等待I/O操作的完成,而另一個線程使用thread的interrupt方法中斷了當前線程。未檢查型異常類主要有:1在java.lang中:ArithmeticException:表示遇到了算術的異常問題,例

16、如0作為除數。ArrayStoreException:試圖把與數組類型不相符的值存入數組。ClassCastException:試圖把一個對象的引用強制轉換為不適宜的類型。InderOutOfBoundsException:數組的下標越界。NullPointerException:試圖使用一個空的對象引用。SecurityException:檢測到了違反平安的行為。2在java.util中:EmptyStaceException:試圖訪問一個空堆棧中的一個元素。NoSuchElementException:試圖訪問一個空向量中的元素。三Java語言標準對異常處理的要求Java語言規定必須對已檢

17、查型異常作處理,編譯器會對此作檢查,要么在方法體中聲明拋出已檢查型異常,要么使用catch語句捕獲已檢查型異常進行處理,不然不能通過編譯2。已檢查型異常用于以下環境:1)該異常發生后是可以被恢復的,如一個Internet連接發生異常被終止后,可以重新連接再進行后續操作。2)程序依賴于不可靠的外部條件,該依賴條件可能出錯,如系統I/O。3)該異常發生后并不會導致程序處理錯誤,進行一些處理后可以繼續后續操作。Java語言標準中將任何Error的子類以及RuntimeException的子類都稱為未檢查型異常。而其它異常都稱為已檢查型異常。三 Java異常的處理機制一Java異常處理機制具體實現在J

18、ava程序運行出現異常時,發生異常的程序段要拋出異常,而運行系統負責尋找一段代碼來處理異常。Java語言中,創立一個異常對象并將它交給運行系統稱為拋出一個異常,又稱為異常拋出。在Java中,一個方法要拋出異常,必須遵循一定的規定,即所謂的“異常標準。異常標準采用了一個額外的關鍵字:throws。要使方法拋出異常,應在方法聲明中,位于參變量列表的后面即throws后面列舉全部潛在的異常類型。假假設Java中的某方法可能拋出一個異常,但程序中沒有對其進行控制,編譯器會偵測到這個情況,通知程序員必須在此方法內進行異常控制,或者從方法里拋出一個異常。通過遵守異常標準,Java可在編譯期保證異常處理的正

19、確性。當Java拋出一個異常,程序將從導致異常的代碼處跳出,JVM檢測尋找和try關鍵字匹配的處理該異常的catch塊,如果找到,將控制權交到catch塊中的代碼,然后繼續往下執行程序, 如果沒有找到處理該異常的catch塊,try塊中發生異常的代碼不會被重新執行,在所有的finally塊代碼被執行和當前線程的所屬的ThreadGroup的uncaughtException方法被調用后,遇到異常的當前線程被終止。Java異常處理的語句形式如下:try/正常執行的代碼可能產生異常throw(異常類1 e,異常類2 e,異常類n e)catch(異常類1 e)/異常類1的處理代碼catch(異常類

20、2 e)/異常類2的處理代碼catch(異常類n e)/異常類n的處理代碼finally/執行去除工作的語句Java程序運行在try塊中,如果產生了異常,那么不再運行try塊下面的語句,而直接進入catch塊中,尋找第一個與之匹配的異常類型。try/catch語句會自動在try塊后面的各個catch塊中,找出與該異常類相匹配的參數。如果該參數符合以下三個條件之一時,那么認為這個參數與產生的異常相匹配4。(1)參數與產生的異常屬于同一個類。(2)參數是產生異常的父類。(3)參數是一個接口,產生的異常實現了這一個接口。當產生的異常找到了第一個與之相匹配的參數時,就執行這一參數的catch塊中的Ja

21、va代碼。執行完catch塊后,程序恢復執行,但不會回到異常發生處繼續執行而是執行try/catch結構后面的代碼。finally語句可以說是為異常處理事件提供的一個清理機構。一般是用來關閉文件或者釋放其他的系統資源作為try/catch/finally結構的一局部,可以沒有finally塊。如果存在finally塊,無論try塊中是否發生異常,是否執行過catch塊,都要執行finally塊。用finally塊的一個好處,就是把方法中所有去除狀態和關閉系統文件的語句放在一起,不但防止代碼的重復,更是減少出現遺漏語句,對于程序以后的修改也較為集中和方便。二Java中異常發生的原因異常發生有三種

22、原因:1Java虛擬機檢測到了非正常的執行狀態,這些狀態可能由三種因素之一引起: = 1 * GB3 表達式的計算違背了Java語言的語義,例如:數組越界、除數為0等。 = 2 * GB3 在載入和鏈接Java程序時出現錯誤。 = 3 * GB3 超出了系統的資源限制,例如使用了太多的內存這些無法預知的異常。2Java程序代碼中的throw語句被執行。3發生異步異常,其可能的原因有Thread類的stop方法被調用;JVM內部發生錯誤;運行時庫出現了內部錯誤等。三Java異常處理的優點在面向過程的傳統語言中對程序中可能出現的錯誤一般采取:查錯、報錯和排錯的處理錯誤代碼和常規代碼混雜在一起的方法

23、。比方在C語言面向過程的一種編程語言中輸出流的處理偽代碼是:建立一個文件輸入流;if(建立不成功) 報錯;處理錯誤;else 從輸入流中讀入一個字符; if(讀入不成功) 報錯;處理錯誤;關閉該文件的輸入流if(關閉不成功) 報錯;處理錯誤; else else 經過這樣的處理,程序可以保證正常地運行。但是程序的每一步都要考慮是否會發生錯誤,出現了錯誤又該如何處理的問題。這不但使程序代碼的行數大大增加,而且,處理錯誤代碼和正常代碼混雜在一起,使程序流程變得十分復雜,不利于閱讀。此外,它對于同一類型的錯誤也不方便進行統一的處理。于上面等價實現地面向對象語言處理異常的偽代碼為:try 建立一個文件

24、輸入流;讀取一個字符;關閉該輸入流;catch( 文件輸入流翻開失敗 ) 報錯;處理錯誤; catch( 讀入字符失敗 ) 報錯;處理錯誤;面向對象語言的異常處理對于面向過程語言處理錯誤的方法有三種好處:其一將處理錯誤代碼和正常代碼別離;其二能夠將異常沿著調用堆棧向上傳播;其三能按異常類型和異常對象分組。四 Java異常處理技術及其應用一拋出異常如果有一個現成或者已定義的異常可以使用,那么拋出異常很容易。只要滿足以下三點:1找到一個恰當的異常類2構造一個該類的實例3拋出該實例比方我們經常遇到IOException異常發生,其中它的一個子類是EOFException,就是描述在輸入過程中碰到一個

25、未預期的文件結尾標志,我們拋出該異常的方法如下:throw new EOFException ( );或者這樣:EOFException e = new EOFException ( );throw e ;二捕獲異常 要想捕獲一個異常,需要設置一個try/catch的代碼塊。try塊的最簡單形式如下: try codemore codecatch (ExceptionType e ) handler for this type如果try塊內的任何代碼拋出了由catch塊中指定的異常,那么程序跳過try塊中的其它代碼,程序執行catch塊中的處理代碼。假設try塊沒有任何代碼拋出異常,那么程序會

26、直接跳過catch塊的內容。當然,可以在try塊同時捕獲多個異常,并分別對每種類型加以不同的處理。三堆棧幀在前,通過使用Throwable類的printStacktrace方法來獲得堆棧結構的文本描敘。現在,可以通過調用getStackTrace方法來獲得一個StackTraceElement對象的數組,通過研究該數組,就可以分析程序運行情況。例如:Throwable t = new Throwable ( );StackTraceElement frames = t.getStackTrace ( );For ( int i= 0;iframes.length;i+) 使用StackTrac

27、eElement類提供的方法獲取文件名以及當前執行的代碼行行號的方法,同樣,它還提供獲取類名、方法名的方法。而toString方法可以產生一個格式化字符串,其中包含那些獲得的信息。以下程序輸出一個遞歸調用方法的堆棧情況。import java.util.*;import javax.swing.*;public class StackTest /* 返回 n! = 1 * 2 * . . . * n 的結果 */ public static int factorial (int n) System.out.println (factorial ( + n + ): ) ; Throwable

28、t = new Throwable( ); StackTraceElement frames = t.getStackTrace(); for ( int i = 0 ;i frames.length; i+ ) System.out.println( frames i ); int r ; if (n = 1) r = 1; else r = n * factorial(n - 1); / 遞歸調用factorial方法 System.out.println(return + r); return r; public static void main(String args) String

29、input = JOptionPane.showInputDialog( 請輸入一個整數: ); int n =Integer.parseInt(input); factorial(n); System.exit( 0 ); /退出程序 由于需要從標準輸入中獲取整數數字,Integer.ParseInt(input)方法可能會產生異常。運行程序時界面:圖31 輸入界面如果我們要實現遞歸方法factorial(3),通過getStackTrace方法可以查看程序運行的過程。其結果為如下: 圖32 遞歸方法factorial(3)的輸出結果而這個程序可能產生的一個異常是NumberFormatEx

30、ception異常。當異常產生后,JVM調用該異常處理。其運行界面如下:圖33 輸入一個產生異常的數據返回到控制臺的結果為描述該異常:圖34 輸入異常數據時在控制臺產生的結果四自定義異常由于在Java中,異常也被看成是對象,而且異常和一般的對象沒有什么不同。因此,任何類都可以定義它自己的異常,并用throw語句引發它們。其中,throw語句由帶有一個對象的關鍵字throw組成,這個對象應該是Exception或其子類的一個實體對象。要注意的是,當執行了一條throw語句后,就不會執行該語句之后的任何代碼了。通常每個異常類提供一個默認的構造器以及一個包含詳細信息的構造器。使用Throwable的

31、toString方法會輸出該詳細信息,這個方法對代碼調試是很有用處。例如創立這樣的異常類:class FileFormatException extends IOException public FileFormatException ( ) public FileFormatException ( ) super ( gripe) ; String readData ( BufferedReader in ) throws FileFormatException while ( ) if ( ch=-1) /EOF標記,即文件結尾 if (nlen) throw new FileFormat

32、Exception ( ); /拋出自定義的異常類FileFormatException return s; 五關于圖形界面程序的異常捕獲對于一個非圖形界面的程序而言,如果一個異常沒有被捕獲,那么程序會終止運行并且在控制臺輸出一條包含異常類型以及堆棧內容的信息。而對于具有圖形界面的程序包含applet以及應用程序,也會輸出這些錯誤信息,但是程序會返回用戶界面外層循環中去。下面我們從一個有趣的程序-顏色調和板來討論圖形界面程序處理異常的情況。在源代碼見附錄中,程序可以根據我們輸入紅色、綠色、藍色RGB、亮度、飽和度和色度值來調節顏色。整個程序除了可能會產生RuntimeException異常外,

33、這個程序還會產生NumberFormatException異常。當然這是已檢查型異常。下面我們來看它在JVM中的運行情況:圖41 輸入正常數據時的顏色調和板當我們改變紅色值為非法的一個輸入,比方:“AB時,其運行結果為如下:圖42 輸入一個產生異常的數據顏色未變化,好似程序發生邏輯錯誤似的沒有按照我們希望的去運行其實程序已將控制權轉到控制中心去了,這個圖形還處于初始化階段在輸入“AB前。在控制中心我們發現如下一些異常發生描述:圖43 異常產生后返回到控制臺的說明 這說明發生了NumberFormatException數字格式異常異常后,并沒有繼續往下執行代碼。由于數字格式異常為已檢查型異常,直

34、接調用系統的方法處理了。JVM報告程序發生了數字格式異常產生,并將其具體的情況報告給用戶。但是,是不是這個程序不能再接受正常的輸入數據運行呢?還是必須要重新啟動才能運行?我們將“紅色值由“AB改為“200后發現顏色改變,這說明該程序還能運行。結果如下列圖:圖44 將產生異常的輸入數據更改后的顏色調和板可見當輸入了正常的數據后,程序就像第一次運行一樣,可以正確的顯示顏色了。我們得到的結論是:局部Java圖形界面程序發生異常后不需要重新初始化,依舊可以運行,但必須不再有異常發生。五 Java異常處理根本原那么合理使用Java異常機制可以使程序健壯而清晰,但是,Java異常處理機制也常常會被錯誤地使

35、用,下面就討論一些關于使用異常的原那么:(一)不要忽略已檢查型異常注意下面的代碼:try method1(); /method1拋出Exception Acatch(Exception A) /捕獲Exception Ae.rintStackTrace( ); /打印捕獲異常上面的代碼似乎沒有什么問題,捕獲異常后將異常打印,然后繼續執行。事實上在catch塊中對發生的異常情況并沒有作任何處理。雖然程序能夠繼續執行,但是由于這里的操作已經發生異常,將會導致以后的操作不能按照預期的情況開展下去,可能導致兩個結果。一種情況是這里的異常導致在程序中別的地方拋出一個異常,這會使程序員在調試時感到迷惑,因

36、為新的異常拋出的地方并不是程序真正發生問題的地方,也不是發生問題的真正原因。另外一種情況程序繼續運行,并得出一個錯誤的輸出結果,這種問題更加難以捕捉,因為很可能把它當成一個正確的輸出。那么應該如何處理呢?一般有四個選擇:處理異常,進行修復以讓程序繼續執行;重新拋出異常,在對異常進行分析后發現這里不能處理它,那么重新拋出異常,讓調用者處理;將異常轉換為用戶可以理解的自定義異常再拋出,這時應該注意不要喪失原始異常信息;不要捕獲異常。因此,當捕獲一個未檢查型異常時,必須對異常進行處理;如果認為不必要在這里作處理,就不要捕獲該異常,在方法體中聲明方法拋出異常,由上層調用者來處理該異常。(二)不要一次捕

37、獲所有的異常我們常見如下關于異常處理的代碼:trymethod1(); /method1拋出ExceptionAmethod2(); /method2拋出ExceptionBmethod3(); /method3拋出ExceptionCcatch(Exception e) /捕獲所有異常 代碼中使用一個catch子句捕獲了所有異常,看上去很簡潔,一個代碼段就捕獲了全部的異常。但是這里有兩個潛在的缺陷,一是對try塊中拋出的每種異常,很可能需要不同的處理和恢復措施,而由于這里只有一個catch塊,分別處理就不能實現。二是try塊中還可能拋出RuntimeException,代碼中捕獲了所有可能拋

38、出的RuntimeException而沒有作任何處理,掩蓋了編程的錯誤,會導致程序難以調試。我們應該處理為以下的代碼:trymethod1();method2();method3();catch (ExceptionA e)/分別捕獲和處理三種異常 catch (ExceptionB e) catch (ExceptionC e) (三)使用finally塊釋放資源關鍵字finally保證程序使用任何方式離開try塊,finally塊中的語句都會被執行。當程序中使用了外界資源,如數據庫連接、文件等,將釋放這些資源的代碼寫入finally塊中是很好的處理方式。必須注意的是,在finally塊中不

39、能拋出異常。Java異常處理機制保證在任何情況下必須先執行finally塊然后再離開try塊,因此在try塊中發生異常的時候,Java虛擬機先轉到finally塊執行finally塊中的代碼,finally塊執行完畢后,再向外拋出異常。如果在finally塊中拋出異常,try塊捕捉的異常就不能拋出,外部捕捉到的異常就是finally塊中的異常信息,而try塊中發生的真正的異常堆棧信息那么喪失了。Connectioncon = null;try con=dataSource.getConnection();/拋出數據庫異常catch(SQLException e ) /捕獲異常進行一些處理后再將

40、數據庫異常拋出給調用者處理throw e;finally try con.close();catch(SQLException e) e.printStackTrace();由于con為null,finally塊有異常發生,從而使try塊中發生的異常堆棧信息喪失。其調用者會得到如下信息:myPackage.MyClass.method1(methodl.Java:266)(四)異常不能影響對象的狀態異常產生后不能影響對象的狀態,這是異常處理中的一條重要規那么。一個函數中發生異常后,對象的狀態應該和調用這個函數之前保持一致,以確保對象處于正確的狀態中。如果對象是不可變對象(指調用構造函數創立后就

41、不能改變的對象),即創立后沒有任何方法可以改變對象的狀態,那么異常發生后對象狀態肯定不會改變。如果是可變對象,必須在編程中注意保證異常不會影響對象狀態。有三個方法可以做到異常不能影響對象地狀態:1將可能產生異常的代碼和改變對象狀態的代碼分開,先執行可能產生異常的代碼,如果產生異常,就不執行改變對象狀態的代碼。2對不容易別離產生異常代碼和改變對象狀態代碼的方法,定義一個recover方法,在異常產生后調用recover方法修復被改變的類變量,恢復方法調用前的類狀態。3在方法中使用對象的拷貝,這樣當異常發生后,被影響的只是拷貝,對象本身不會受到影響。(五)注意喪失或忽略的異常 在程序設計中,可以喪

42、失忽略一些異常,但是為了以后更好地維護代碼,最好不要喪失異常。比方下面的代碼:public void method2( ) trymethod1( ); /method1進行了數據庫操作catch( SQLException e )/捕獲數據庫異常后將該異常封裝為/MyException后重新拋出throw new MyException(“發生了數據庫異常: +e.getMessage);public void method3( ) trymethod2( ); /調用method2(),拋出MyExceptioncatch (MyException e)e.printStackTrace(

43、 );在method2的代碼中,try塊捕獲method1拋出的數據庫異常SQLException后,拋出了新的自定義異常MyException。這段代碼是似乎沒有什么問題,但在控制臺的輸出卻是:MyException:發生了數據庫異常:對象名稱“MyTable無效atMyClass.method2(MyClass.Java:232)atMyClass.method3(MyClass.Java:255)原始異常SQLException的信息喪失了,這里只能看到method2里面定義的MyException的堆棧情況,而method1中發生的數據庫異常的堆棧那么看不到。如何排錯呢?只有在meth

44、od1的代碼行中一行行去尋找數據庫操作語句。JDK的開發者們也意識到了這個情況,在中,Throwable類增加了兩個構造方法,public Throwable ( Throwablecause)和public Throwable ( Stringmessage, Throwablecause ),在構造函數中傳入的原始異常堆棧信息將會在printStackTrace方法中打印出來。但在中就只能靠程序員來實現打印原始異常堆棧信息了。實現過程也很簡單,只需要在自定義的異常類中增加一個原始異常字段,在構造函數中傳入原始異常,然后重載printStackTrace方法,首先調用類中保存的原始異常的pr

45、intStackTrace方法,然后再調用方法就可以打印出原始異常信息了。可以這樣定義前面代碼中出現的MyException類:public class MyException extends Exceptionpublic SMException ( Throwable cause )/構造函數this.cause1=cause;public MyException ( Strings ,Throwable cause )super(s);this.cause1=cause;/重載printStackTrace方法,打印出原始異常堆棧信息public void printStackTrace

46、()if(cause1!=null)cause1.printStackTrace();super.printStackTrace(s);public void printStackTrace(PrintStream s)if(cause1!=null)cause1.printStackTrace(s); super.printStackTrace(s);public void printStackTrace( PrintWriter s )if(cause1!=null)cause1.printStackTrace(s);super.printStackTrace(s);private Thr

47、owable cause1;(六)不要同時使用異常機制和返回值來處理異常我們可能會使用類似下面一段代碼:trydoSomething( );catch(MyException e)if(e.getErrcode=-1) if(e.getErrcode=-2) 假設過一段時間再來閱讀這段代碼,你很難弄明白程序的意思。混合使用Java異常處理機制和返回值使程序的異常處理局部變得混亂,并難以理解。在程序中,如果有多種不同的異常情況,就應該定義多種不同的異常,而不要像上面代碼那樣。綜合使用Exception和返回值。處理應該如下:try doSomething( );/doSomething()拋出M

48、yExceptionA和MyExceptionBcatch(MyExceptionA e) /捕獲異常分別進行處理 catch(MyExceptionB e) (七)不要讓try塊過于龐大有人習慣用一個龐大的try塊包含所有可能產生異常的代碼,這樣有兩個害處:一是閱讀代碼的時候,在try塊冗長的代碼中,不容易知道到底是哪些代碼會拋出哪些異常,不利于代碼維護;二是使用try捕獲異常是以程序執行效率為代價的,將不需要捕獲異常的代碼包含在try塊中,影響了代碼執行的效率。因此,在Java程序中最好將try塊編寫得簡潔些。六 結束語Java是一種面向對象的程序設計語言,Java的異常處理機制非常出色。

49、Java中的所有異常都是從根底類Throwable里繼承而來的,所以可確保我們得到的是一個通用接口。丟棄一個錯誤的異常后,Java異常標準是在編譯期間檢查并執行的。被取代的方法必須遵守那一方法的根底類的異常標準。Java可丟棄指定的異常或者從指定異常衍生出來的其他異常。這樣一來,運用try/catch/finally異常處理機制,最終得到的是更為“健壯的異常控制代碼。Java異常處理為大的程序工程帶來很好的健壯性。當然,在寫本論文時,由于對Java的學習沒到達深入、精通程度,掌握Java異常處理技術也不是很全面,故而論文中對Java圖形程序的異常處理方面和Java異常處理機制具體實現的討論仍有

50、缺乏之處有待以后改良。致謝參考文獻1Bloch . Java Programming Language Guide.北京:機械工業出版社,2001.2Cay S.Horstmann .Core Java 2(第6版) .北京:機械工業出版社,2004.3Rogers Cadenhead ,Laura Lemay.Teach Yourself Java 2 In 21days.北京:人民郵電出版社,2004.4朱福喜,唐曉軍.Java程序設計技巧與實例.北京:人民郵電出版社,2004.5譚浩強,程龍,楊海蘭,吳功宜.Java編程技術.北京:人民郵電出版社,2003.6彭晨陽.Java實用系統開發

51、指南. 北京:機械工業出版社,2003.7Java 2 SDK Standard Edition Documentation9Java 2 程序設計.北京:清華大學出版社,2004.10Kalthy Sierra,Bert Bates.Java 2學習指南.北京:人民郵電出版社,2004.11耿祥義.Java根底教程.北京:清華大學出版社,2004.12朱福喜. HYPERLINK :/ ptpress /books/Book_Information.asp?BID=11746 Java程序設計技巧與開發實例.北京:人民郵電出版社,2004.13謝小樂.J2EE經典實例詳解.北京:人民郵電出版

52、社,2003.14Y.Daniel Liang.Java語言程序設計(第三版).北京:機械工業出版社,2005.15Bruce Eckel.Java編程思想. 北京:機械工業出版社,2005.附錄、源代碼 的源代碼:import java.awt.*;import java.awt.event.*;import javax.swing.*;public class SwingColorTest extends JFrame SwingColorControls RGBcontrols, HSBcontrols; JPanel swatch; public SwingColorTest() su

53、per(顏色調和板); setSize(400, 100); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel pane = new JPanel(); GridLayout grid = new GridLayout(1, 3, 5, 15); pane.setLayout(grid); /使用網格布局 swatch = new JPanel(); swatch.setBackground(Color.black); String rgbLabels = 紅色, 綠色, 藍色 ; RGBcontrols = new SwingCol

54、orControls(this, rgbLabels); String hsbLabels = 色調, 飽和度, 亮度 ; HSBcontrols = new SwingColorControls(this, hsbLabels); pane.add(swatch); pane.add(RGBcontrols); pane.add(HSBcontrols); setContentPane(pane); pack(); setVisible(true); /main函數 public static void main(String arguments) JFrame frame = new Sw

55、ingColorTest(); /RGB和HSB的相互轉換 void update(SwingColorControls control) Color c; / 從輸入文本框中獲得數據 int value = new int3; for (int i = 0; i 3; i+) valuei = Integer.parseInt(control.settingi.getText(); if ( (valuei 255) ) valuei = 0; control.settingi.setText( + valuei); if (control = RGBcontrols) c = new Color(value0, value1, value2); /轉化為HSB float hsbValues = new float3; float HSB = Color.RGBtoHSB(value0, value1, value2,hsbValues); HSB0 *= 360; HSB1 *= 100; HSB2 *= 100; for (int i = 0; i 3; i+) HSBcontrols.settingi.setText(String.

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論