调试也有陷阱?
我想是有的, 今天就发现了一个. 如果以后还能发现, 再继续补充吧
自从今年四月正式写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这样的工具是否也会出现这样的小陷阱