调试其实是门很深的学问,在分析Eclipse源代码的过程中积累了很多经验,但大多与多数人无用,现介绍一个简单而非常有用的调试功能及它的适用场合。
首先看一段代码:
1
2 public class Simple {
3 public static void main(String[] args) {
4 int max = 10;
5 for(int i = 0; i < max ; i++)
6 {
7 simpleAction(i);
8 }
9 }
10
11 private static void simpleAction(int i) {
12 int tmp = i;
13 if (i == 5)
14 throw new NullPointerException("5 is invalid number!");
15 System.out.println("Number "+tmp+" reached!");
16 }
17 }
18
这段代码非常简单,就是打印10个数字,但中间一个出了异常,假设我们忘记Eclipse的Exception BreakPoint(在复杂的场合,不一定抛Exception),于是看到控制台除了异常信息之后,我们可在第7行和第12行设置断点,看调用i到底发生了什么。
启动调试后一切正常,除了你必须F8 4次,因为0-4正常,但也在断点处,很烦人。有没有可能激活断点一次呢?当然可以。
从控制台看到5 is invalid number,那么这次调试只针对5,我们可以简单的设置一下:
第一步:
第二步在出现的对话框内,选中Enable Condition,接着输入我们的condition: i==5
OK,再调试启动Simple,发现断点激活是在i=5的时候,我们就可以F6一步一步看到底发生了什么。
这种条件调试在使用复杂的框架的时候极其有用,举个例子:
GMF的AbstractActionHandler有N多子类,你必须直接或间接的继承它,同时使用它的API,在它的API很复杂而我还在探索的情况下,出错在所难免,出错后在AbstractActionHandler的某个API里设置了一断点,但你只想关心自己写的子类,否则会按F8超过1分钟,那么我们可以在上面的condition text里面输入:
this.getClass().getName().equals("foo.bar.MyDiagramAction")
就可以省掉很多麻烦。
当然condition可以写的很复杂,可以针对断点的context写任意Java代码。