2013-03-08 5 views
2

Предположим, что у меня есть метод или конструктор, который использует другой метод или конструктор, который объявляет исключение RuntimeException.Выданные заявления бросков для RuntimeExceptions

// Example: 
public MyClass(Object arg) { 
    setVar(arg); 
    // Not responsible for dealing with the exception 
} 

public void setVar(Object arg) throws MyRuntimeException { 
    if(!isValidArg(arg)) 
     throw new MyRuntimeException("Got you, evil argument!"); 
    // Do something 
} 

В этом случае возникает исключение RuntimeException, если, например, необходимые предварительные условия не выполняются.

Вопрос: Должен ли метод/конструктор упаковки объявлять одно и то же Исключение, если его аргумент может вызвать выброс Исключения?

+0

Как вы вызываете метод экземпляра внутри конструктора? –

+1

@ LutzHorn Что вы подразумеваете под этим? почему он не должен это делать? Если метод не выполняет тяжелую обработку, это не должно быть проблемой. – giorashc

+0

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

ответ

3

Это действительно зависит от контекста, что код. Если вы хотите сделать что-то, что самодостаточное, как библиотеки, вы можете поймать Exception внутри класс, просто чтобы использовать ваш очиститель кода.

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

+2

Я думаю, что «нести броски, пока не имеет смысла, семантически» имеет смысл. Я хотел бы отметить, что исключение не всегда возможно, хотя так часто у вас есть выбор между броском проверенного исключения, исключением исключения выполнения и объявлением или не объявлением. – Samuel

+0

Да, согласился. :) – christopher

0

RuntimeExceptions выбрасывается без необходимости включать его в подпись бросков ни для одного из методов.

Вы должны прочитать this об исключении выполнения

+0

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

+0

Если это так, зачем использовать исключения во время выполнения? Он может легко использовать проверенные исключения – giorashc

+0

Я думаю, что некоторые люди предпочтут бросить отметку, а некоторые предпочтут бросить непроверенные исключения. В моем случае это не выбор, но исключение среды выполнения выбрасывается, и я пытаюсь найти лучший способ обработать его в методе упаковки, не отвечающем за обработку. – Samuel

1

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

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

0

no, Runtime Исключения не проверяются. I.e компилятор не заставляет вас иметь дело с ними. Но как хорошая практика программирования вы можете обрабатывать исключение, такое как

public MyClass(Object arg) { 
    try{ 
    setVar(arg); 
} 
catch(MyRuntimeException exp){ 
    // code if exception arises 
} 
+0

Это верно, но конструктор, возможно, не несет ответственности за устранение исключения. – Samuel

+0

Его плохая идея * вообще *, чтобы ловить исключения, подобные этому в конструкторе, если вы не очень * уверены, что можете завершить конструкцию объекта таким образом, который имеет смысл. Если нет, то лучше, чтобы исключение распространялось до вызывающего. – Perception

+0

, если вы вызываете метод из конструктора, и этот метод может генерировать исключение, тогда вы можете не быть уверенным, что в любом случае вы создадите объект. – navyad