在程序出現問題時,我們需要找到並解決掉這些惱人的Bug,才能使程序順利的運行下去。但是,當代碼很多,程序很大的時候,找起來就很麻煩。
所以,我們需要借助工具——Eclipse/MyEclipse中的Debug(調試)手段。而調試的時候,需要入口和觀測點,所以我們需要設置斷點來進行調試。
1 設置斷點的方法:
在想要加上斷點的行的邊側欄雙擊/右鍵後點擊Toggle Breakpoint即可。
2 啟動調試模式
設置好斷點後,在項目中右鍵 —— Debug As —— Java Application即可
或點擊如圖所示處:
2 斷點的設置位置:
a) 屬性斷點: 在成員變量的所在行設置的斷點
(第4行的邊側欄上的標志)
b) 方法斷點: 在方法的執行處或定義處設置的斷點(一般推薦在執行處設置)
(17行邊側欄的標志)
c) 條件斷點: 滿足某條件後即停止運行程序
設置方法: 在斷點所在行點擊右鍵 Breakpoint Properties(斷點屬性) —— 如圖
注:
1 書寫條件斷點的條件時,不要有分號。 sum > 8(正確) sum>8;(錯誤)
2 設置斷點時要牢記一個原則: 哪行設置了斷點,哪行在調試時就將要被執行。
所以要正確設置位置,以免出現未初始化的錯誤。
比如:
public void print() {
* int sum = 0;//在此行設置了斷點
for (int i = 0; i < 10; i++) {
sum += i;
}
System.out.println(sum);
}
而我設置條件斷點時如下書寫: sum > 5。斷點設置在定義sum的一行,說明調試的時候sum是未被定義的,而斷點屬性設置為 sum>5—— sum都未被定義怎麼可以賦值呢?所以錯誤。
3 如果想要修改代碼/設置條件斷點/Breakpoint Properties中的屬性值,一定要先停止Debug,再設置,然後重新開始Debug
這樣才能生效。
4 Breakpoint Properties中幾個屬性的介紹
在斷點處右鍵 —— Breakpoint Properties 會進入如圖的界面:
3 修改變量的值
什麼時候用? 比如如果程序中某一個變量的值有問題,我們在調試時需要修改一下才能使程序運行下去。
(點擊changeValue後彈出對話框)
4 幾個需要掌握的用於調試的按鈕
a: resume 英 [ri'zju:m] (重新開始) 點擊後直接執行下一個斷點,如果在循環中,執行下一次循環。
b: step into 一步一步執行
c: step over 一行一行執行,子函數也被看做是一步(main()裡面調用print()使用step over一次就跳過了)
d: drop to frame 。
主要用途是
所有變量狀態快速恢復到方法開始時候的樣子重新執行一遍,即可以一遍又一遍地在那個你關注的
上下文中進行多次調試(結合改變變量值等其它功能),而不用重來一遍調試到哪裡了。當然,
原來執行過程中產生的副作用是不可逆的(比如你往數據庫中插入了一條記錄)。
使用方式:
這種調試的回退不是萬能的,只能在當前線程的棧幀中回退,也就說最多只能退回到當前線程的
調用的開始處。回退時,請在需要回退的線程方法上點右鍵,選擇 "Drop to Frame"
5 異常斷點 —— 幫助我們確定異常位置。
位置: 調試界面右上角,Breakpoints一欄中——add Java Excption BreakPoint
經常遇見一些異常,然後程序就退出來了,要找到異常發生的地方就比較難了,還好可以打一個異常斷點,
這樣一來,當異常發生時,代碼會停在異常發生處,
定位問題時應該比較有幫助。
如何使用?
1 在控制台的出錯信息中找到異常的名稱
2 復制後打開debug界面,添加同名的異常斷點
3 (如果只是為了找出異常出現的位置,不需要加斷點)直接開始調試,程序就會停在異常出現的地方。
6 Expressions(非常靈活!強推!)
位置: 調試界面右上角Expressions一欄
通過添加表達式 Expressions 來查看各變量的值。
的(Add a new watch expression)符號。
書寫代表某值的表達式: 如:sum, sum*3; getSum(); 等等
點擊OK 可以查看結果如下:(查看結果相當方便吧,個人感覺比變量窗口更有用!)
比Varibles強大之處在於:
1 查看值的方式更加靈活,根據表達式可以查看任意的值。比如: 變量,變量表達式,方法的返回值
方法的返回值的表達式等等。sum, sum*3; getSum(); printRestule() 等等
參考資料包括:
1 黑馬程序員許剛老師視頻
2 http://eggbucket.iteye.com/blog/1381610(MyEclipse調試技術)