Попробуйте:
jps -J-Djava.io.tmpdir=/app/client/program/tomcat/temp
Вместо этого вам, возможно, придется создать исключение ожидаемого типа.
... catch(CupcakeException e) {
throw new IOException("The sky is falling", e);
}
Используйте исключение ReaderException, которое будет служить корневым интерфейсом вашей иерархии исключений. ReaderException также предоставляет ссылку на другие исключения, которые возникают из-за исключений более низкого уровня.
Возможно, вы могли бы создать абстрактный класс ReaderSpecificException, поместить его в интерфейс и подкласс CupcakeException из этого абстрактного класса.
Фактически, раздел , откуда вы взяли этот код , предлагает также объяснение:
Чтобы переместить n дисков с колышка A на колышек C:
- переместите n − 1 дисков из A в B. Это оставляет диск #n один на колышке A
- переместите диск #n из A в C
- переместите n − 1 дисков из B в C, чтобы они оказались на диске #n
Совершенно очевидно, что сначала вам нужно удалить диски n - 1, чтобы получить доступ к n -й. И что вы должны сначала переместить их на другую привязку, а не на то место, где вы хотите, чтобы появилась полная башня.
Код в вашем сообщении имеет три аргумента, помимо количества дисков: исходный привязка, привязка назначения и временная привязка , на которой можно хранить диски между ними (где каждый диск размером n - 1 подходит).
Рекурсия на самом деле происходит дважды, здесь, один раз перед Writeln
, один раз после. Диск перед Writeln
переместит n - 1 дисков на временную привязку, используя привязку назначения в качестве временного хранилища (аргументы в рекурсивном вызове находятся в другом порядке). После этого оставшийся диск будет перемещен на целевой колышек, а затем вторая рекурсия вынуждает переместить всю башню, перемещая башню n - 1 с временной привязки на целевой колышек над диском. п.
Если вы не позволяете одному исключению наследовать от другого, существует конструктор в классе исключений, который принимает бросаемый объект в качестве второго аргумента, как Торбьорн Равн Андерсен уже показал в своем примере короткого кода. Это позволяет вам сгенерировать более абстрактное исключение, и каждая часть вашего кода, которая должна знать больше, чем просто «есть ошибка», может искать причину более высокого исключения.
Исключение является частью интерфейса. Определите общий родительский элемент для всех ваших исключений в интерфейсе, если вы можете переопределить интерфейс.
Вы также можете сделать CupcakeException дочерним элементом IOException.
Просто не используйте проверенные исключения.
Пример, который вы показали, является одной из причин, по которым проверенные исключения являются плохими.
Однако основная причина заключается в том, что пользователь вашего устройства для чтения кексов должен будет обработать ваше исключение независимо от того, заинтересован он в этом или нет.
Итак, вместо:
Value value = reader.read();
Вы заставляете его сделать это:
Value value = null;
try {
value = reader.read();
} catch (Exception e) {
// now what??
}
value.doSomething(); // potential NPE here
Подумайте, какое из них лучше, более читабельно и менее подвержено ошибкам и просто прекратите использовать проверенные исключения.
РЕДАКТИРОВАТЬ:
Я удивлен отрицательной оценкой. Есть ли люди, которые все еще думают, что проверенные исключения - это здорово? Если да, то вот несколько ссылок, почему вы не должны использовать проверенные исключения: