这是我第一次尝试在java中使用代码双向链接程序:
这是我在双重链接列表中获取所有项目的迭代器的实现
public Object next() {
if(list.getSize()==0){
throw new NoSuchElementException();
}else{
current=current.getNext();
return current.getItem();
}
}
请不要嘲笑我,不管我尝试得到什么
找不到符号:符号类:NoSuchElementException
我尝试创建一个扩展Exception的NoSuchElementException.java类
然后我得到
未报告的异常NoSuchElementException;必须被抓住或 宣布被抛出 抛出新的NoSuchElementException();
我尝试将代码更改为:
public Object next() throws NoSuchElementException {
然后我得到
ElementsIterator中的next()无法实现next() java.util.Iterator的;重写方法不抛出 NoSuchElementException异常
任何人都可以指出我错在哪里。如果这还不足以解决此问题,请告诉我。
答案 0 :(得分:15)
您需要导入java.util.NoSuchElementException
,而不是创建自己的。
答案 1 :(得分:6)
编译器给你一个很好的解释。您正在提供Iterator中声明的next()
方法的实现,其签名为:
public Object next()
但是,您已经引入了自己的已检查异常NoSuchElementException
,这要求您将方法签名更改为:
public Object next() throws NoSuchElementException
现在您不再实现接口中声明的方法了。您已更改签名。
无论如何,有几种方法可以解决这个问题:
更改您的NoSuchElementException
课程,使其继承自RuntimeException而非Exception
。然后,您不需要在方法签名中添加throws
声明。
摆脱您的自定义异常类型,而是使用已经从RuntimeException
继承的Java内置NoSuchElementException。这几乎肯定是更好的选择。
答案 2 :(得分:2)
Iterator的next()方法没有声明要抛出的异常,因此如果要实现异常,则不能对异常进行十分转换。
但是,您可以抛出未经检查的异常。简单的解决方法是将自定义异常定义为extends RuntimeException
,这将使其成为未经检查的异常。
我有点困惑,因为NoSuchElementException 已经是一个未经检查的异常,除非你已经定义了自己的NoSuchElementException类。
答案 3 :(得分:1)
检查java.util.Iterator和java.util.NoSuchElementException的javadoc。如果实现Iterator接口,则必须遵循其规则。导入该异常;不要创造它。