1. Java的異常跟蹤棧:編程
異常對象的printStackTrace()方法用於打印異常的跟蹤棧信息,根據printStackTrace()方法的輸出結果,咱們能夠找到異常的源頭,並跟蹤到異常一路觸發的過程。spa
在面向對象編程中,大多數複雜操做都會被分解成一系列方法調用。因爲一個大的業務功能須要由多個對象來共同實現,在最終的編程模型中,不少對象將經過一系列方法調用來實現通訊,執行任務。調試
因此面向對象的應用程序運行時,常常會發生一系列方法調用,從而造成「方法調用棧」,異常的傳播則相反:只要異常沒有被徹底捕獲(包括異常沒有被捕獲,或異常被處理後從新拋出了新異常),異常從發生異常的方法逐漸向外傳播,首先傳給該方法的調用者,該方法調用者再次傳給其調用者......直至最後傳到main方法,若是main方法依然沒有處理該異常,JVM會停止該程序,並打印異常的跟蹤棧信息。對象
雖然printStackTrace()方法能夠很方便地用於追蹤異常的發生狀況,能夠用它來調試程序,但在最後發佈的程序中,應該避免使用它。應該對捕獲到的異常進行適當的處理,而不是簡單地將異常的跟蹤棧信息打印出來。面向對象編程
2. 異常處理規則:class
成功的異常處理應該實現以下4個目標:程序
- 使程序代碼混亂最小化
- 捕獲並保留診斷信息
- 通知合適的人員
- 採用合適的方式結束異常活動
下面是達到這種效果的基本準則:方法
2.1.不要過分使用異常通信
2.2.不要使用過於龐大的try塊數據
2.3.避免使用Catch All語句(指的是一種異常捕獲模塊,它能夠處理程序發生的全部可能異常)。
2.4.不要忽略捕獲到的異常
- 處理異常:對異常進行合適的修復,而後繞過異常發生的地方繼續執行;或者用別的數據進行計算,以代替指望的方法返回值;或者提示用戶從新操做......總之,對於Checked異常,程序應該儘可能修復。
- 從新拋出新異常:把當前運行環境下能作的事情儘可能作完,而後進行異常轉譯,把異常包裝成當前層的異常,從新拋出給上層調用者。
- 在合適的層處理異常:若是當前層不清楚如何處理異常,就不要在當前層使用catch語句來捕獲該異常,直接使用throws聲明拋出該異常,讓上層調用者來負責處理該異常。
總之,不要忽略異常!既然已經捕獲到異常,那catch塊理應作些有用的事情---處理並修復這個錯誤。catch塊整個爲空,或者僅僅打印出錯信息都是不妥的!