調(diào)試其實(shí)是門(mén)很深的學(xué)問(wèn),在分析Eclipse源代碼的過(guò)程中積累了很多經(jīng)驗(yàn),但大多與多數(shù)人無(wú)用,現(xiàn)介紹一個(gè)簡(jiǎn)單而非常有用的調(diào)試功能及它的適用場(chǎng)合。
首先看一段代碼:
首先看一段代碼:
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
這段代碼非常簡(jiǎn)單,就是打印10個(gè)數(shù)字,但中間一個(gè)出了異常,假設(shè)我們忘記Eclipse的Exception BreakPoint(在復(fù)雜的場(chǎng)合,不一定拋Exception),于是看到控制臺(tái)除了異常信息之后,我們可在第7行和第12行設(shè)置斷點(diǎn),看調(diào)用i到底發(fā)生了什么。
啟動(dòng)調(diào)試后一切正常,除了你必須F8 4次,因?yàn)?-4正常,但也在斷點(diǎn)處,很煩人。有沒(méi)有可能激活斷點(diǎn)一次呢?當(dāng)然可以。
從控制臺(tái)看到5 is invalid number,那么這次調(diào)試只針對(duì)5,我們可以簡(jiǎn)單的設(shè)置一下:
第一步:

第二步在出現(xiàn)的對(duì)話框內(nèi),選中Enable Condition,接著輸入我們的condition: i==5

OK,再調(diào)試啟動(dòng)Simple,發(fā)現(xiàn)斷點(diǎn)激活是在i=5的時(shí)候,我們就可以F6一步一步看到底發(fā)生了什么。
這種條件調(diào)試在使用復(fù)雜的框架的時(shí)候極其有用,舉個(gè)例子:
GMF的AbstractActionHandler有N多子類(lèi),你必須直接或間接的繼承它,同時(shí)使用它的API,在它的API很復(fù)雜而我還在探索的情況下,出錯(cuò)在所難免,出錯(cuò)后在AbstractActionHandler的某個(gè)API里設(shè)置了一斷點(diǎn),但你只想關(guān)心自己寫(xiě)的子類(lèi),否則會(huì)按F8超過(guò)1分鐘,那么我們可以在上面的condition text里面輸入:
this.getClass().getName().equals("foo.bar.MyDiagramAction")
就可以省掉很多麻煩。
當(dāng)然condition可以寫(xiě)的很復(fù)雜,可以針對(duì)斷點(diǎn)的context寫(xiě)任意Java代碼。
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
這段代碼非常簡(jiǎn)單,就是打印10個(gè)數(shù)字,但中間一個(gè)出了異常,假設(shè)我們忘記Eclipse的Exception BreakPoint(在復(fù)雜的場(chǎng)合,不一定拋Exception),于是看到控制臺(tái)除了異常信息之后,我們可在第7行和第12行設(shè)置斷點(diǎn),看調(diào)用i到底發(fā)生了什么。
啟動(dòng)調(diào)試后一切正常,除了你必須F8 4次,因?yàn)?-4正常,但也在斷點(diǎn)處,很煩人。有沒(méi)有可能激活斷點(diǎn)一次呢?當(dāng)然可以。
從控制臺(tái)看到5 is invalid number,那么這次調(diào)試只針對(duì)5,我們可以簡(jiǎn)單的設(shè)置一下:
第一步:
第二步在出現(xiàn)的對(duì)話框內(nèi),選中Enable Condition,接著輸入我們的condition: i==5
OK,再調(diào)試啟動(dòng)Simple,發(fā)現(xiàn)斷點(diǎn)激活是在i=5的時(shí)候,我們就可以F6一步一步看到底發(fā)生了什么。
這種條件調(diào)試在使用復(fù)雜的框架的時(shí)候極其有用,舉個(gè)例子:
GMF的AbstractActionHandler有N多子類(lèi),你必須直接或間接的繼承它,同時(shí)使用它的API,在它的API很復(fù)雜而我還在探索的情況下,出錯(cuò)在所難免,出錯(cuò)后在AbstractActionHandler的某個(gè)API里設(shè)置了一斷點(diǎn),但你只想關(guān)心自己寫(xiě)的子類(lèi),否則會(huì)按F8超過(guò)1分鐘,那么我們可以在上面的condition text里面輸入:
this.getClass().getName().equals("foo.bar.MyDiagramAction")
就可以省掉很多麻煩。
當(dāng)然condition可以寫(xiě)的很復(fù)雜,可以針對(duì)斷點(diǎn)的context寫(xiě)任意Java代碼。