Java程序调试技巧浅析
创始人
2024-04-04 08:01:26
0

用Java这么久,说来惭愧,大部分情况下使用的调试语句是:System.out.println("value:"+value);这种形式,这两天看了些关于Java程序调试技巧的东西,总结一下,以后要积极使用:

一:一种很简单的方法就是使用一个boolean量如:debugMode,需要看看程序的输出时可以使用:if(debugMode)System.out.println("..");

在项目完毕后把debugMode变量设为false;这种方法的不足是:为了启动或者禁止debug,必须改动代码

二:一个比上述方法稍好的是:使用Java -D:如:Java -Ddebug=true MyClass,在使用这种方法时,必须在你所有的class中添加System.getProperty("debug")来取得调试标志,这样***种方法的使用,就改为:

  1. public static final boolean debug;  
  2.    static{  
  3.       String sDebug=System.getProperty("debug");  
  4.       if(sDebug!=null && sDebug.equalsIngnoreCase("true"))  
  5.          debug=true;  
  6.       else 
  7.          debug = false;  
  8.    } 

这样在不更改source code的情况下可以直接修改Java程序调试标志,但是这样不够灵活,比如你不能指定哪一部分使用调试功能,而只是要使用调试功能就必须在代码的全部使用,这样就引出了第三种调试方法,可以定义一个用于调试的类。

  1.   public class DebugManager {  
  2.  
  3.  public static final String SYSTEM_DEBUG_KEY="system.Debug";  
  4.  public static final boolean debug;  
  5.  static {  
  6.      debug = toBoolean(SYSTEM_DEBUG_KEY);  
  7.  }  
  8.  private static boolean toBoolean(String key){  
  9.   boolean debug;  
  10.   String sDebug = System.getProperty(key);  
  11.   if(sDebug != null && sDebug.equalsIgnoreCase("true"))  
  12.    debug = true;  
  13.   else 
  14.    debug =false;  
  15.   return debug;  
  16.  }  
  17.    
  18.  public static boolean getSystemDebug(){  
  19.   return debug;  
  20.  }  
  21.  public static boolean getSystemDebug(String applicationKey) {  
  22.   if(debug || toBoolean(applicationKey))  
  23.    return true;  
  24.   else 
  25.    return false;  
  26.  }  

这样对于一个application(Test)可以着牙功能调用:
   boolean debug =DebugManager.getSystemDebug(applicationKey);

要打开Test的调试功能,只需:

java -DTest.Debug=true Test

当然这个类可以进行进一步扩展,比如将其变为日志管理,控制调试信息的输出位置等

三、使用断言

断言是Merlin(jdk1.4)中一项新功能,默认情况下不使用断言,但是programmer可以在任何时候enable或者disable这项功能,从而可以在测试时启用断言验证,而在部署时禁用断言验证,而程序运行时若用户碰到问题时再重新启用断言。断言检查,失败时不会抛出

Exception,而是抛出AssertionError,

1,断言的两种语法形式:

     (1)assert booleanExpression;

      (2) assert boolExpression:message; //message将作为错误抛出后的结果显示

assert必须位AssertTest于可执行快中,不能将assert和实例的类变量一起使用,但可以将其放在任何方法内。

2,在Java程序调试中启用断言:

编译:javac -source 1.4 AssertTest.java

运行:java -ea AssertTest (参数)

-ea是启用断言的简易方法,但是-ea不能用于系统类,

(1)若要对系统类使用断言:则需:-enablesystemassertions,或者-esa

(2)若要对这个package启用断言:要在-ea后加(:,package的名字,...)如对test.util包及其所有的子包启用断言,则可以java -ea:test.util... AssertTest

 

【编辑推荐】

  1. 关于Java反射机制的一个实例
  2. 在Java应用程序中使用Jfreechart配置
  3. 浅谈为什么Java接口中不允许定义变量
  4. Java的异常和断言学习笔记
  5. 关于Java继承的一些复习

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...