难以在Java中抛出NoSuchElementException

时间:2011-10-02 23:54:20

标签: java exception

这是我第一次尝试在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异常

任何人都可以指出我错在哪里。如果这还不足以解决此问题,请告诉我。

4 个答案:

答案 0 :(得分:15)

您需要导入java.util.NoSuchElementException,而不是创建自己的。

答案 1 :(得分:6)

编译器给你一个很好的解释。您正在提供Iterator中声明的next()方法的实现,其签名为:

public Object next()

但是,您已经引入了自己的已检查异常NoSuchElementException,这要求您将方法签名更改为:

public Object next() throws NoSuchElementException

现在您不再实现接口中声明的方法了。您已更改签名。

无论如何,有几种方法可以解决这个问题:

  1. 更改您的NoSuchElementException课程,使其继承自RuntimeException而非Exception。然后,您不需要在方法签名中添加throws声明。

  2. 摆脱您的自定义异常类型,而是使用已经从RuntimeException继承的Java内置NoSuchElementException。这几乎肯定是更好的选择。

答案 2 :(得分:2)

Iterator的next()方法没有声明要抛出的异常,因此如果要实现异常,则不能对异常进行十分转换。

但是,您可以抛出未经检查的异常。简单的解决方法是将自定义异常定义为extends RuntimeException,这将使其成为未经检查的异常。

我有点困惑,因为NoSuchElementException 已经是一个未经检查的异常,除非你已经定义了自己的NoSuchElementException类。

答案 3 :(得分:1)

检查java.util.Iteratorjava.util.NoSuchElementException的javadoc。如果实现Iterator接口,则必须遵循其规则。导入该异常;不要创造它。