Сложность создания исключений NoSuchElementException в Java - PullRequest
7 голосов
/ 03 октября 2011

это моя первая попытка создать программу с двусвязным кодом в java:

Это моя реализация получения итератора для получения всех элементов в двусвязном списке

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

    }else{ 
        current=current.getNext();
        return current.getItem();
    } 
}

Пожалуйста, не смейтесьу меня, но все, что я пытаюсь, я получаю

Не могу найти символ: символ класс: NoSuchElementException

Я пытался создать класс NoSuchElementException.java, который расширяет Exception

Тогда я получаю

незарегистрированное исключение NoSuchElementException;должен быть перехвачен или объявлен как выброшенный. бросить новое NoSuchElementException ();

Я попытался изменить код на:

public Object next() throws NoSuchElementException {

Затем я получил

next () в ElementsIterator не может реализовать next () в java.util.Iterator;переопределенный метод не выдает NoSuchElementException

Может кто-нибудь указать, где я ошибся.Если этой информации недостаточно для решения этой проблемы, сообщите мне.

Ответы [ 4 ]

15 голосов
/ 03 октября 2011

Вам нужно импортировать java.util.NoSuchElementException вместо того, чтобы создавать свой собственный.

6 голосов
/ 03 октября 2011

Компилятор дает вам довольно хорошее объяснение. Вы предоставляете реализацию метода next(), объявленного в Итератор , который имеет подпись:

public Object next()

Однако вы ввели собственное проверенное исключение под названием NoSuchElementException, которое требовало, чтобы вы изменили сигнатуру метода на:

public Object next() throws NoSuchElementException

Теперь вы больше не реализуете метод, объявленный в интерфейсе. Вы изменили подпись.

В любом случае, есть несколько способов исправить это:

  1. Измените свой NoSuchElementException класс, чтобы он наследовал от RuntimeException вместо просто Exception. Тогда вам не нужно добавлять объявление throws к сигнатуре метода.

  2. Избавьтесь от своего пользовательского типа исключения и вместо этого используйте встроенную в Java NoSuchElementException , которая уже наследуется от RuntimeException. Это почти наверняка лучший вариант.

2 голосов
/ 03 октября 2011

Метод next () Итератора не объявляет исключение, которое выдается, поэтому вы не можете декальзировать исключение, если реализуете его.

Однако вы можете выбросить исключение без проверки . Простое исправление состоит в том, чтобы определить ваше пользовательское исключение как extends RuntimeException, что сделает его непроверенным исключением.

Я немного запутался, потому что NoSuchElementException уже является непроверенным исключением, если вы не определили свой собственный класс NoSuchElementException.

1 голос
/ 03 октября 2011

Проверьте javadocs для java.util.Iterator и java.util.NoSuchElementException . Если вы реализуете интерфейс Iterator, вы должны играть по его правилам. Импортировать это исключение; не создавай это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...