調試其實是門很深的學問,在分析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代碼。