难以在Java中抛出NoSuchElementException

sre*_*sad 7 java exception

这是我第一次尝试使用java中的代码双向链接程序:

这是我在双链表中获取迭代器以获取所有项目的实现

public Object next()  {
    if(list.getSize()==0){
     throw new NoSuchElementException();

    }else{ 
        current=current.getNext();
        return current.getItem();
    } 
}
Run Code Online (Sandbox Code Playgroud)

请不要嘲笑我,不管我尝试得到什么

找不到符号:符号类:NoSuchElementException

我尝试创建一个扩展Exception的类NoSuchElementException.java

然后我明白了

未报告的异常NoSuchElementException; 必须被捕获或声明抛出新的NoSuchElementException();

我尝试将代码更改为:

public Object next() throws NoSuchElementException {
Run Code Online (Sandbox Code Playgroud)

然后我明白了

ElementsIterator中的next()无法在java.util.Iterator中实现next(); 重写方法不会抛出NoSuchElementException

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

SLa*_*aks 16

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


aro*_*oth 6

编译器给你一个很好的解释.您提供了next()Iterator中声明的方法的实现,该方法具有以下签名:

public Object next()
Run Code Online (Sandbox Code Playgroud)

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

public Object next() throws NoSuchElementException
Run Code Online (Sandbox Code Playgroud)

现在您不再实现接口中声明的方法了.你已经改变了签名.

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

  1. 更改您的NoSuchElementException类,使其继承RuntimeException而不仅仅是Exception.然后,您不需要向throws方法签名添加声明.

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