Выдача исключения, не определенного в интерфейсе

Попробуйте:

jps -J-Djava.io.tmpdir=/app/client/program/tomcat/temp
16
задан Scott 3 August 2009 в 16:32
поделиться

6 ответов

Вместо этого вам, возможно, придется создать исключение ожидаемого типа.

... catch(CupcakeException e) {
   throw new IOException("The sky is falling", e);
 }
13
ответ дан 30 November 2019 в 21:37
поделиться

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

9
ответ дан 30 November 2019 в 21:37
поделиться

Возможно, вы могли бы создать абстрактный класс ReaderSpecificException, поместить его в интерфейс и подкласс CupcakeException из этого абстрактного класса.

0
ответ дан 30 November 2019 в 21:37
поделиться

Фактически, раздел , откуда вы взяли этот код , предлагает также объяснение:

Чтобы переместить n дисков с колышка A на колышек C:

  1. переместите n − 1 дисков из A в B. Это оставляет диск #n один на колышке A
  2. переместите диск #n из A в C
  3. переместите n − 1 дисков из B в C, чтобы они оказались на диске #n

Совершенно очевидно, что сначала вам нужно удалить диски n - 1, чтобы получить доступ к n -й. И что вы должны сначала переместить их на другую привязку, а не на то место, где вы хотите, чтобы появилась полная башня.

Код в вашем сообщении имеет три аргумента, помимо количества дисков: исходный привязка, привязка назначения и временная привязка , на которой можно хранить диски между ними (где каждый диск размером n - 1 подходит).

Рекурсия на самом деле происходит дважды, здесь, один раз перед Writeln , один раз после. Диск перед Writeln переместит n - 1 дисков на временную привязку, используя привязку назначения в качестве временного хранилища (аргументы в рекурсивном вызове находятся в другом порядке). После этого оставшийся диск будет перемещен на целевой колышек, а затем вторая рекурсия вынуждает переместить всю башню, перемещая башню n - 1 с временной привязки на целевой колышек над диском. п. Если вы не позволяете одному исключению наследовать от другого, существует конструктор в классе исключений, который принимает бросаемый объект в качестве второго аргумента, как Торбьорн Равн Андерсен уже показал в своем примере короткого кода. Это позволяет вам сгенерировать более абстрактное исключение, и каждая часть вашего кода, которая должна знать больше, чем просто «есть ошибка», может искать причину более высокого исключения.

0
ответ дан 30 November 2019 в 21:37
поделиться

Исключение является частью интерфейса. Определите общий родительский элемент для всех ваших исключений в интерфейсе, если вы можете переопределить интерфейс.

Вы также можете сделать CupcakeException дочерним элементом IOException.

2
ответ дан 30 November 2019 в 21:37
поделиться

Просто не используйте проверенные исключения.

Пример, который вы показали, является одной из причин, по которым проверенные исключения являются плохими.

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

Итак, вместо:

Value value = reader.read();

Вы заставляете его сделать это:

Value value = null;
try {
    value = reader.read();
} catch (Exception e) {
    // now what??
}

value.doSomething();   // potential NPE here

Подумайте, какое из них лучше, более читабельно и менее подвержено ошибкам и просто прекратите использовать проверенные исключения.

РЕДАКТИРОВАТЬ:

Я удивлен отрицательной оценкой. Есть ли люди, которые все еще думают, что проверенные исключения - это здорово? Если да, то вот несколько ссылок, почему вы не должны использовать проверенные исключения:

  • Ни одна современная структура не использует проверенные исключения (Spring, EJB3 и т. Д.)
  • Статья с примерами кода здесь
  • StackOverflow тема
  • Эффективная Java (разделы 58 и 59) - здесь
1
ответ дан 30 November 2019 в 21:37
поделиться
Другие вопросы по тегам:

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