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

1

Я читаю более точные броски в java 7 http://docs.oracle.com/javase/7/docs/technotes/guides/language/catch-multiple.html, в котором говорится:

Подробно, в Java SE 7 и более поздних версиях, когда вы объявляете один или несколько типов исключений в предложении catch и регенерируете исключение, обрабатываемое этим блоком catch, компилятор проверяет, что тип повторного исключения соответствует следующим условиям:

The try block is able to throw it.
There are no other preceding catch blocks that can handle it.
It is a subtype or supertype of one of the catch clause exception parameters.

поэтому я написал программу для ее проверки.

public class MorePreciseRethrow {
    public static void main(String args[]){
        try {
            foo("First");
        } catch (FirstException e) {
            e.printStackTrace();
        } catch (SecondException e) {
            e.printStackTrace();
        }
    }

    private static void foo(String exceptionName) throws FirstException, SecondException{
        try{
            if(StringUtils.equals("First",exceptionName)){
                throw new FirstException();
            }
        }catch(Exception e){
            throw e;
        }
    }
}

class FirstException extends Exception{

}

class SecondException extends Exception{

}

но это не порождает даже предупреждения компилятора с помощью jdk7. Теперь мой блок try никогда не сможет запустить SecondException, но мой компилятор не проверял его. Является ли указанная строка в документе неправильной или я ошибаюсь?

Теги:
exception-handling

3 ответа

3

Компилятор проверяет, только заголовок метода

private static void foo(String exceptionName) throws FirstException, SecondException

исключает исключение.

У вас может быть несколько реализаций методов, поэтому одна реализация может выдать exeption, а другая нет. но оба должны быть в постели.

2

В Java нет требования, что код в методе, который объявляет, что он throws исключение на самом деле быть в состоянии бросить его.

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

  • 0
    Для нестатического метода вы можете вызвать это проверенное исключение позже, создав подкласс класса и переопределив метод. + 1
1

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

private static void foo(String exceptionName) throws FirstException,
        SecondException {
    try {
        throw new FirstException();
    } catch (FirstException | SecondException e) {
        throw e;
    }
}

Создает UnreachableCodeBlock для SecondException в Java 7+.

  • 0
    это другое исключение
  • 0
    Это ошибка компиляции, а не Exception . И (опять же) ваша ссылка для multi-catch .
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню