学习Java编程时,用到了ListIterator迭代器,容器类是Vector。在进行一次迭代时,出现了错误,调试了挺长一段时间才发现自己在使用中的错误之处。
错误代码片断如下:
while(iter.hasPrevious())
{
if (some condition)
{
tmpObject = (SomeObject)iter.previous();
tmpObject.someOperation();
}
}
在这里iter是ListIterator的一个实例,SomeOjbect是Vector中存储的对象类型。
这个错误可能对于一个Java程序老手根本不会出现,但对于我这个菜鸟再加上有过使用STL迭代器的惯性,很容易就写下了上面的错误代码。错误在于:在Java中,迭代器的previous()或next()操作不仅返回下一个元素,它还负责推进迭代器的迭代动作进行下去。在上面的代码中,一旦条件不满足,就会跳过if块,这样就会跳过一次推进迭代进行的动作,导致一些不可预料的错误。
改正后的代码片断如下:
while(iter.hasPrevious())
{
tmpObject = (SomeObject)iter.previous();
if (some condition)
{
tmpObject.someOperation();
}
}
从表面上看,只是一句代码位置的不同,但得到的结果却是不一样的。
错误代码片断如下:
while(iter.hasPrevious())
{
if (some condition)
{
tmpObject = (SomeObject)iter.previous();
tmpObject.someOperation();
}
}
在这里iter是ListIterator的一个实例,SomeOjbect是Vector中存储的对象类型。
这个错误可能对于一个Java程序老手根本不会出现,但对于我这个菜鸟再加上有过使用STL迭代器的惯性,很容易就写下了上面的错误代码。错误在于:在Java中,迭代器的previous()或next()操作不仅返回下一个元素,它还负责推进迭代器的迭代动作进行下去。在上面的代码中,一旦条件不满足,就会跳过if块,这样就会跳过一次推进迭代进行的动作,导致一些不可预料的错误。
改正后的代码片断如下:
while(iter.hasPrevious())
{
tmpObject = (SomeObject)iter.previous();
if (some condition)
{
tmpObject.someOperation();
}
}
从表面上看,只是一句代码位置的不同,但得到的结果却是不一样的。