如何编写规范的Java Iterator?自定义AlbumIterator编译报错如何解决?
Java迭代器作业问题解答
一、编译报错原因及修复方案
两个报错均为编码失误,同时存在隐藏逻辑bug:
- 第一个报错(找不到
Fotoablum类)存在两处问题:- 拼写错误:你写的
Fotoablum是错误拼写,正确类名是Fotoalbum - 泛型参数使用错误:Iterator接口的泛型参数是迭代返回的元素类型,你的
next()方法返回的是Foto类型,所以泛型应该写Iterator<Foto>,不是相册类本身
- 拼写错误:你写的
- 第二个报错(找不到
ablum变量)是纯拼写错误:你的成员变量命名为album,代码里写的ablum颠倒了字母顺序 - 隐藏bug:构造函数中
this.aktuell=aktuell是无效自赋值,aktuell没有初始值,会导致迭代初始状态异常
修复后完整代码
import java.util.Iterator; import java.util.NoSuchElementException; // 泛型改为迭代返回的Foto类型 public class AlbumIterator implements Iterator<Foto>{ Fotoalbum album; Foto aktuell; public AlbumIterator(Fotoalbum album){ this.album = album; // 修复自赋值问题,初始状态设为null this.aktuell = null; } @Override // 加@Override注解避免方法签名写错 public boolean hasNext(){ if(this.aktuell == null){ // 修复空相册误返回true的逻辑问题 return this.album.erstesFoto != null; }else{ return this.aktuell.getNächstes() != null; } } @Override public Foto next(){ if(!hasNext()){ // 统一前置校验,符合Iterator接口规范 throw new NoSuchElementException("Keine weiteren Elemente vorhanden"); } if(this.aktuell == null){ // 修复拼写错误ablum改为album this.aktuell = this.album.erstesFoto; return this.aktuell; } this.aktuell = this.aktuell.getNächstes(); return this.aktuell; } @Override public void remove() { throw new UnsupportedOperationException("Diese Aktion wird nicht unterstützt."); } }
二、合格Iterator的编写规范
- 严格遵守接口约定:
- 泛型参数必须和
next()返回值类型完全一致 hasNext()方法要保证幂等:多次调用不会改变迭代器状态,返回结果一致- 若
hasNext()返回false时调用next(),必须抛出NoSuchElementException - 不需要支持删除操作时,
remove()方法统一抛出UnsupportedOperationException即可
- 泛型参数必须和
- 状态管理正确:迭代器的游标变量(本案例中为
aktuell)初始化要合理,避免空指针异常 - 所有接口实现方法建议加
@Override注解,避免方法签名写错编译不提示的问题
三、是否必须编写main函数
不需要。main函数是Java独立可执行程序的入口,只有你需要直接运行这个类做测试的时候才需要编写。如果这个AlbumIterator只是作为工具类给Fotoalbum类调用,完全可以删掉main函数。
内容的提问来源于stack exchange,提问作者Esoteriker
相关产品推荐
相关产品推荐

