Что сделать исключений при реализации java.lang. Итератор

java.lang.Iterator интерфейс имеет 3 метода: hasNext, next и remove. Для реализации итератора только для чтения необходимо предоставить реализацию 2 из тех: hasNext и next.

Моя проблема состоит в том, что эти методы не объявляют исключений. Таким образом, если мой код в итеративном процессе объявляет исключения, я должен включить свой итеративный код в блоке попытки/выгоды.

Моя текущая политика состояла в том, чтобы повторно бросить исключение, включенное в a RuntimeException. Но это имеет проблемы, потому что контролируемые исключительные ситуации потеряны, и клиентский код больше не может ловить те исключения явно.

Как я могу работать вокруг этого ограничения в классе Итератора?

Вот пример кода для ясности:

class MyIterator implements Iterator
{
    @Override
    public boolean hasNext()
    {
        try
        {
            return implementation.testForNext();
        }
        catch ( SomethingBadException e ) 
        {
            throw new RuntimeException(e);
        }
    }

    @Override
    public boolean next()
    {
        try
        {
            return implementation.getNext();
        }

        catch ( SomethingBadException e ) 
        {
            throw new RuntimeException(e);
        }
    }

    ...
}

29
задан Vincent Robert 23 March 2010 в 10:19
поделиться

6 ответов

Я реализовал много итераторов, иногда поверх итераторов с проверкой исключения (ResultSet концептуально является итератором записи, InputStream y концептуально - итератором байта) и так далее. Это очень красиво и удобно (можно реализовать архитектуру труб и фильтров для множества вещей).

Если вы предпочитаете объявить свои исключения , то объявите новый тип итератора (ExceptionIterator, он будет похож на Runnable и Callable). Вы можете использовать его вместе с вашим кодом, но не можете составить его с помощью внешних компонентов (библиотека классов Java или 3d party libs).

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

Исключения во время выполнения не так уж и ужасны. На примере. Используйте их в спящем режиме для реализации прокси и тому подобного. Они должны исключать исключения из БД, но не могут объявлять их в своих реализациях List.

9
ответ дан 28 November 2019 в 02:03
поделиться

Почему бы не написать свой собственный класс событий? Что-то вроде

class Event
  def initialize
    @handlers = Array.new
  end

  def fire
    @handlers.each do |v|
      v.call
    end
  end

  def << handler
    @handlers << handler
  end
end

e = Event.new

e << lambda { puts "hello" }
e << lambda { puts "test" }
e.fire

Это всего лишь минимальный образец, но может быть расширен любыми способами. Добавьте такие параметры, как sender и eventArgs в .Net или что угодно; -)

-121--2954718-

Профилировщик CUDA довольно грубый и не предоставляет много полезной информации. Единственный способ серьезно микрооптимизировать код (при условии, что вы уже выбрали наилучший алгоритм) имеет глубокое понимание архитектуры GPU, особенно в том, что касается использования общей памяти, узоров доступа к внешней памяти, использования регистров, заполнения потоков, деформаций и т.д.

Может быть, вы могли бы разместить свой код ядра здесь и получить некоторые отзывы?

Форум разработчиков nVidia CUDA также является хорошим местом для помощи

-121--2583157-

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

И я уверен, что заставлять клиентов справляться с исключениями, заставляя их проверять, - плохая практика. Это просто загрязняет ваш код или заставляет переносить исключения в среду выполнения или заставлять обрабатывать их в месте вызова, но не централизованно. Моя политика заключается в том, чтобы максимально избегать использования проверенных исключений. Рассмотрим IOException на Closable.close () : полезно или удобно? Случаи, когда это большая редкость, но каждый разработчик Java в мире вынужден им заниматься. Чаще всего его глотают или регистрируют в лучшем случае. И представьте, насколько это увеличивает размер кода ! Есть несколько сообщений о проверенных исключениях с их темной стороны:

  1. «Нужны ли проверенные исключения Java?» Брюса Экеля
  2. Проблемы с проверенными исключениями Разговор с Андерсом Гейльсбергом, Билл Веннерс с Брюсом Экелем
  3. Недостатки дизайна Java, C2 wiki

Но на мой взгляд они редки и обычно касаются реализации какого-то конкретного модуля. И они не дают большой прибыли.

11
ответ дан 28 November 2019 в 02:03
поделиться

В зависимости от среды, в которой вы хотите это сделать, это возможно с помощью Excel Interop. Однако это довольно беспорядок, связанный с COM, и обеспечение очистки ресурсов других экземпляров Excel остаются висеть на вашем компьютере.

Проверьте Пример MSDN , если вы хотите узнать больше.

В зависимости от формата вы можете самостоятельно создавать CSV или SpreadsheetML, что не слишком сложно. Другими альтернативными вариантами являются использование сторонних библиотек. Очевидно, они стоят денег.

-121--2299959-

в соответствии с manpage -D создает прокси-сервер носков.

-D [bind_address:]port
             Specifies a local ``dynamic'' application-level port forwarding.
             This works by allocating a socket to listen to port on the local
             side, optionally bound to the specified bind_address.  Whenever a
             connection is made to this port, the connection is forwarded over
             the secure channel, and the application protocol is then used to
             determine where to connect to from the remote machine.  Currently
             the SOCKS4 and SOCKS5 protocols are supported, and ssh will act
             as a SOCKS server.  Only root can forward privileged ports.  Dy-
             namic port forwardings can also be specified in the configuration
             file.
-121--4950583-

Как человек, которому нравится Java проверил исключения, я думаю, что проблема (недостаток Java проектировать, если хотите) в том, что стандартные библиотеки не поддерживают универсальный тип итератора, где метод next выдает проверенное исключение.

База кода для Сезам имеет класс исполнения Iterator с именем Iterable , что делает именно это. Подпись следующая:

Interface Iteration<E,X extends Exception>

Type Parameters:
    E - Object type of objects contained in the iteration.
    X - Exception type that is thrown when a problem occurs during iteration.

Это, кажется, работает в ограниченном контексте Сезам, где используются конкретные подклассы, которые «фиксируют» параметр типа исключения. Но (конечно) он не интегрируется со стандартными типами сбора, новым для синтаксисом цикла Java 5 и так далее.

3
ответ дан 28 November 2019 в 02:03
поделиться

Если у вас есть URL-адрес изображения, вы можете открыть ресурс, который он представляет, используя поток (абстракцию): новый URL («your.image.url.com») .openStream () . Этот вызов метода возвращает объект типа InputStream , который можно передать в качестве аргумента методу setStream () .

Если не требуется указывать поток напрямую, можно открыть удаленный поток, создать растровое изображение, а затем использовать экземпляр WallpaperManager или context.setWallpaper (растровое изображение) (это устарело), чтобы установить растровое изображение в качестве обоев.

Для справки просмотрите этот поток .

-121--3894431-

Сохраните страницу в статическом файле и используйте правила .htaccess для обработки статической страницы.

Я не уверен в точных деталях, но я думаю, что codeignitor и boust для drupal сделать это.

-121--4435154-

Если ваша реализация не имеет свойств, требуемых для интерфейса Iterator, почему вы хотите использовать ее?

Я не вижу другого решения, кроме RuntiveException (с проблемами).

1
ответ дан 28 November 2019 в 02:03
поделиться

Что бы вы ни делали, не используйте этот трюк: -)

http://blog.quenta.org/2006/11/generic-exceptions.html

0
ответ дан 28 November 2019 в 02:03
поделиться

hasNext не должен на самом деле бросать исключение - он должен проверить, что это нормально, чтобы продолжить и вернуть булевое значение на этом основании (я бы записал любые лежащие в основе исключения с помощью логгера). Я бы бросил RuntimeException, если бы следующий сбой произошел (и записал бы проверенное исключение в журнал с помощью логгера). Следующий сбой не должен произойти в нормальных условиях, если проверка прошла нормально, и если проверка прошла неудачно, то не следует вызывать следующего (отсюда и исключение во время выполнения).

2
ответ дан 28 November 2019 в 02:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: