Как добавить предложение throws Exception при реализации метода, определенного в интерфейсе без предложения throws? - PullRequest
3 голосов
/ 15 декабря 2010

Мне нужен класс для навигации по коллекции, затем я реализовал интерфейс Iterator.Но проблема в том, что моя реализация метода next () должна вызвать исключение, потому что члены коллекции должны генерироваться динамически, и исключения могут возникать во время процесса генерации.

Единственное исключение, генерируемое функцией next (), - это NoSuchElementException, что означает, что в коллекции больше нет элементов, и это не отвечает моим потребностям.

Или я вообще не должен реализовывать Iterator?1005 *

Ответы [ 3 ]

5 голосов
/ 15 декабря 2010

Чтобы быть педантичным, вы не реализуете Iterator.next, если вам нужно добавить проверенное исключение.Iterator.next не выбрасывает никаких проверенных исключений, поэтому в основном у Iterator.next есть контракт, по которому ничего плохого не может пойти не так, как надо, о чем действительно нужно думать пользователю (в противоположность, скажем, File.open, где вам нужно беспокоиться о том, что могут возникнуть IOExceptions).

Учитывая это, я бы рассмотрел следующие варианты в таком порядке:

  • Могу ли я удалить отмеченные исключения и заменить их непроверенными исключениями?Это будет моя первая попытка, потому что проверенные исключения вызывают определенную сумятицу каждый раз, когда они появляются.Это легко решило бы ваше решение, потому что тогда ваша следующая () больше не выбрасывает проверенные исключения.Если это сторонняя библиотека, могу ли я обернуть ее (в любом случае, это было бы хорошей идеей) и превратить эти исключения в исключенные объекты в оболочке?

  • Можно ли обернуть исключенияв исключение времени выполнения в итераторе?Есть конструкторы, чтобы сделать это (те, с Throwable).Это, по крайней мере, инкапсулирует то, что вы используете внутри, и позволит вам использовать интерфейс Iterator

  • Могу ли я заменить свой Iterator на Iterable?Если это так, я могу выбросить эти проверенные исключения во время создания Iterable, и тогда итератор не может выбросить исключения.Это будет работать, только если количество элементов невелико.

1 голос
/ 15 декабря 2010

Ну, вы не можете реализовать значение по умолчанию java.util.Iterator, если ваше исключение является проверенным исключением.Одним из решений может быть расширение java.lang.RuntimeException и, следовательно, избежание объявления исключения в сигнатуре метода.

1 голос
/ 15 декабря 2010

Ваш итератор может выдать подкласс RuntimeException.Это не должно быть объявлено в сигнатуре метода.

Обратите внимание, что NoSuchElementException также является подклассом RuntimeException и также не объявляется в сигнатуре метода Iterator.next() (это упоминается только в javadoc).

...