調試也有陷阱?
我想是有的, 今天就發現了一個. 如果以後還能發現, 再繼續補充吧
自從今年四月正式寫Java代碼以來, 越來越驚歎於Java的神奇,且不說自動垃圾收集吧, 連她的調試也好像充滿了神秘色彩 (不過,可能我的Java水平太菜了), 居然圈中一個函數, 能得出函數的最終返回結果, 那麼調試器必須具備類似分析指令碼的功能(我用的是Eclipse 2.1.3). 但是這種強大的功能有時候也會幫倒忙.
來看下面這段普通代碼
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/*
* IteratorDebuggingTrap.java 2004-7-1
*
*
* chenxh
*/
/**
* @author chenxh
* 2004-7-1
*
*
*/
public class IteratorDebuggingTrap {
public static void main(String[] args) {
List list = new ArrayList();
list.add("a");
list.add("b");
list.add("c");
for (Iterator iter = list.iterator(); iter.hasNext();) {
System.out.println(iter.next());
}
}
}
執行結果
a
b
c
沒什麼異常啊, 但是如果你在
System.out.println(iter.next());
加上斷點, 並圈中iter.next()監視,
結果卻是
b
很奇怪,不是嗎. 仔細觀察不難發現, 其實調試器本身也調用iter.next(),每過一次斷點調用一次疊代子的next(), 結果還是和斷點的多少有關的, 即監視的次數, 如果你在
for (Iterator iter = list.iterator(); iter.hasNext();) {
設定了斷點, 結果回是
c
如果你再把代碼的
list.add("c");
去掉, 將會很不幸的得到一個執行階段錯誤
java.util.NoSuchElementException
不過這沒什麼好大驚小怪的了,因為我已經清楚了出錯的原因, 不過剛遇到這種情況是也許會很詫異.
注:我用的IDE是Eclipse, 我的java水平有限, 對一些主流的IDE比如JBuilder也都不怎麼熟悉, 不知道像JBuider這樣的工具是否也會出現這樣的小陷阱