Java程序調(diào)試技巧淺析
用Java這么久,說來慚愧,大部分情況下使用的調(diào)試語句是:System.out.println("value:"+value);這種形式,這兩天看了些關(guān)于Java程序調(diào)試技巧的東西,總結(jié)一下,以后要積極使用:
一:一種很簡單的方法就是使用一個(gè)boolean量如:debugMode,需要看看程序的輸出時(shí)可以使用:if(debugMode)System.out.println("..");
在項(xiàng)目完畢后把debugMode變量設(shè)為false;這種方法的不足是:為了啟動(dòng)或者禁止debug,必須改動(dòng)代碼
二:一個(gè)比上述方法稍好的是:使用Java -D:如:Java -Ddebug=true MyClass,在使用這種方法時(shí),必須在你所有的class中添加System.getProperty("debug")來取得調(diào)試標(biāo)志,這樣***種方法的使用,就改為:
- public static final boolean debug;
- static{
- String sDebug=System.getProperty("debug");
- if(sDebug!=null && sDebug.equalsIngnoreCase("true"))
- debug=true;
- else
- debug = false;
- }
這樣在不更改source code的情況下可以直接修改Java程序調(diào)試標(biāo)志,但是這樣不夠靈活,比如你不能指定哪一部分使用調(diào)試功能,而只是要使用調(diào)試功能就必須在代碼的全部使用,這樣就引出了第三種調(diào)試方法,可以定義一個(gè)用于調(diào)試的類。
- public class DebugManager {
- public static final String SYSTEM_DEBUG_KEY="system.Debug";
- public static final boolean debug;
- static {
- debug = toBoolean(SYSTEM_DEBUG_KEY);
- }
- private static boolean toBoolean(String key){
- boolean debug;
- String sDebug = System.getProperty(key);
- if(sDebug != null && sDebug.equalsIgnoreCase("true"))
- debug = true;
- else
- debug =false;
- return debug;
- }
- public static boolean getSystemDebug(){
- return debug;
- }
- public static boolean getSystemDebug(String applicationKey) {
- if(debug || toBoolean(applicationKey))
- return true;
- else
- return false;
- }
- }
這樣對(duì)于一個(gè)application(Test)可以著牙功能調(diào)用:
boolean debug =DebugManager.getSystemDebug(applicationKey);
要打開Test的調(diào)試功能,只需:
java -DTest.Debug=true Test
當(dāng)然這個(gè)類可以進(jìn)行進(jìn)一步擴(kuò)展,比如將其變?yōu)槿罩竟芾恚刂普{(diào)試信息的輸出位置等
三、使用斷言
斷言是Merlin(jdk1.4)中一項(xiàng)新功能,默認(rèn)情況下不使用斷言,但是programmer可以在任何時(shí)候enable或者disable這項(xiàng)功能,從而可以在測(cè)試時(shí)啟用斷言驗(yàn)證,而在部署時(shí)禁用斷言驗(yàn)證,而程序運(yùn)行時(shí)若用戶碰到問題時(shí)再重新啟用斷言。斷言檢查,失敗時(shí)不會(huì)拋出
Exception,而是拋出AssertionError,
1,斷言的兩種語法形式:
(1)assert booleanExpression;
(2) assert boolExpression:message; //message將作為錯(cuò)誤拋出后的結(jié)果顯示
assert必須位AssertTest于可執(zhí)行快中,不能將assert和實(shí)例的類變量一起使用,但可以將其放在任何方法內(nèi)。
2,在Java程序調(diào)試中啟用斷言:
編譯:javac -source 1.4 AssertTest.java
運(yùn)行:java -ea AssertTest (參數(shù))
-ea是啟用斷言的簡易方法,但是-ea不能用于系統(tǒng)類,
(1)若要對(duì)系統(tǒng)類使用斷言:則需:-enablesystemassertions,或者-esa
(2)若要對(duì)這個(gè)package啟用斷言:要在-ea后加(:,package的名字,...)如對(duì)test.util包及其所有的子包啟用斷言,則可以java -ea:test.util... AssertTest
【編輯推薦】