在使用Eclipse调试Java代码过程中,自己多数情况下仅限于打断点-》调试两个动作。某然发现Eclipse提供了更高阶的一些调试方法,在此记录下来免得自己遗忘,顺便分享。
【图1】
1,行断点——Hit count
在循环或者递归等代码块中可以使用hit count在到达指定次数时暂停线程(或虚拟机)。这在调试一些到达指定次数出错的情况时很有用,比如代码一般运行到十次之后开始出现怪异的错误。用例代码如下:
public static void main(String[] args)
{
int i = 0;
for(; i < 99; i++)//breakpoint is here
{
System.out.println(String.format("Current times is %s .", i));
}
}
当打印输出到:Current times is 49 .的时候断点会自动停止。
2,行断点——condition
设置断点condition的方法:右键单击断点->breakpoint properties->condition,在输入框中输入指定的条件。还以上述代码为例,选择当i >= 60的时候开始触发断点。如下图所示,当代码运行到Current times is 60 .的时候开始停止,并在此之后由于条件一直满足所以不断触发中断。
【图2】
除了普通的Java语句(line point),Ecplise还提供了针对类加载(ClassLoading)断点、监视断点(watchpoint,打在类的内部变量上)、异常断点、方法断点,不同类型的断点有不同的触发条件设置。
3,类加载断点
打在Class上的断点只有hit count选项。默认情况下只有类首次加载的时候会触发中断,使用hit count的机会应该很少,也许可用在调试不同的ClassLoader加载同一个类的情况。
4,监视断点
【图3】
打在类的变量或静态变量上,选项包括hit count、Access、Modification。其中Access或Modification至少需要选中一项才可能会在访问或修改变量值时触发中断。hit count作用自然是在第几次的时候触发中断。
5,异常断点
【图4】
异常断点可以通过Breakpoints视图的Add Java Exception Breakpoint按钮添加,在方法抛出指定的异常的时候会触发中断。可选项包括Caught locations、Uncaught locations、Subclass of this exception分别对应捕获、未捕获、为当前Exception的子类的时候触发中断。在Debug模式下Eclipse会在抛出异常时自动中断,这里的异常断点是指存在多层调用的时候往往原始的异常已经被catch或者封装成其它的异常,通过异常断点可以在原始异常抛出和被捕获的时候中断。
需要注意的是Eclipse默认会在抛出未捕获的异常时中断,所以取消Uncaught locations时看起来是没有效果的,抛出的异常仍然会触发中断。可以通过window-》preferences-》java-》debug取消suspend on uncaought exception的选项,此时只有在勾选了Uncaught locations时才会触发中断。
6,方法断点
【图5】
方法异常可以在进入或离开方法时触发中断,默认情况下会在进入方法时触发中断,通过勾选Exit可以在方法结束时触发中断。
预告后面发布的内容,以鞭策自己不能偷懒,立证在此不写丢人:会在本周内至少发布一篇关于JUnit使用的深入介绍,并在后续完成JUnit原码赏析的博客。