Возвращает значение И выдает исключение?

20

Я работаю с API, который утверждает, что возвращает true, если он преуспевает, и false, если он терпит неудачу. Но, он также утверждает, что бросает разные исключения, если он терпит неудачу. Как он может вернуть false и выдать исключение?

    
задан mark 28.08.2011 в 11:02
источник

3 ответа

25

Невозможно обойти исключение и вернуть значение из одного вызова функции.

Возможно, что-то вроде возврата false , если есть ошибка, но выбрасывает исключение, если вход недействителен.

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

    
ответ дан Jeremy 28.08.2011 в 11:03
  • Вот что я понял. Я думал, что может быть какой-то трюк с окончательным блоком. –  mark 28.08.2011 в 11:06
  • после того, как Исключение брошено, ваша программа перестает работать, поэтому imho невозможно сделать оба. Я действительно задаюсь вопросом, есть ли у вас оператор return в вашем блоке «try», программа все еще передает «последний» блок, потому что если вы вернете значение в блоке try и поместите бросок Exception в Final Block, вы бы Сделали оба .. –  Karel-Jan Misseghers 28.08.2011 в 11:14
  • @ Karel-Jan Misseghers: нет, в Java ваша программа НЕ ОПРЕДЕЛЕНА НЕ прекращает работу после того, как будет выбрано исключение. Вы смущены тем, как работают исключения Java, и, очевидно, еще не сделали многопоточного программирования Java. У вас может быть много потоков, которые долгое время будут работать, когда исключение исключается в другом потоке. Есть много случаев, когда умирающая нить автоматически возобновляется (самым известным из них является EDT Swing на некоторых ОС / JVM: если EDT умирает, новый EDT перезапускается). –  SyntaxT3rr0r 28.08.2011 в 11:58
  • ahaa, многопоточное, теперь я просто буду спокоен (я видел теорию многопоточного программирования на Java, но не использовал ее еще) извините за смущение! –  Karel-Jan Misseghers 28.08.2011 в 13:52
  • @ Karel-Jan: Если у вас есть возврат в try-block, он все равно выполнит блок finally (а затем вернется, если finally-блок не выбрасывает исключение). Если у вас есть возврат в finally-блоке, он будет подавлять исключение (если есть) и вместо этого возвратится. (См. Главу 14 JLS.) –  Paŭlo Ebermann 28.08.2011 в 14:07
15

Вы можете исключить, что имеет a (в данном случае логическое) значение:

public class ValueException extends Exception {
    final boolean value;

    public ValueException(boolean value, String message) {
        super(message);
        this.value = value;
    }

    public boolean getValue() {
        return value;   
    }
}
    
ответ дан Bohemian 28.08.2011 в 14:24
0

В то время как вы можете написать свой код таким образом, чтобы исключение И значение могло быть получено из вызова функции (см. вышеупомянутые сообщения), оно НИКОГДА не должно выполняться в правильном кодировании.

Мне бы очень хотелось увидеть ссылку на документацию по этому API. API должен уделять приоритетное внимание ясности. Выбрасывание исключения и возврат значения оставляет вопрос о том, безопасно ли использовать значение, которое было возвращено, или если оно недействительно.

Помните, что try / catch блоки - это ДРУГОЙ метод обработки исключений. Они не передают исключение из вызывающего метода, но обрабатывают его внутренне таким образом, который разработчик сочтет подходящим.

Если для целей отладки вам нужно увидеть результирующее значение в случае исключения, тогда идея Богемиана работает хорошо.

    
ответ дан HesNotTheStig 01.07.2014 в 15:32