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

Некоторые из моих методов в Java вызывают исключения, такие как NoSuchElementException, IllegalArgumentException и т. д. Но при использовании этих методов эти исключения не проверяются. Другими словами, вызывающая сторона моих методов не обязана выполнять попытку/перехват моих методов, которые вызывают эти исключения. Я читал, что кажется, что исключения по умолчанию «отмечены», и только ошибки «не проверены». Но почему-то исключения, которые я выбрасываю, также не проверяются. Это странно.

Как я могу гарантировать, что когда мой метод выдает исключение, вызывающая сторона ДОЛЖНА поймать исключение во время компиляции? Проще говоря, как я могу создать проверенное исключение?

Спасибо!


person Carven    schedule 10.06.2011    source источник


Ответы (6)


Только RuntimeException и его подклассы не отмечены. (Ну, Error и его подклассы тоже, но вам не следует связываться с Errors.) Все, что вам нужно сделать, чтобы выдать проверенное исключение, — это убедиться, что оно не расширяет RuntimeException.

person cHao    schedule 10.06.2011

См. этот хак, это может помочь (надеюсь, это не ОТ).

public class Test {

    // No throws clause here
    public static void main(String[] args) {
        doThrow(new SQLException());
    }

    static void doThrow(Exception e) {
        Test.<RuntimeException> doThrow0(e);
    }

    @SuppressWarnings("unchecked")
    static <E extends Exception> void doThrow0(Exception e) throws E {
        throw (E) e;
    }
}
person pevik    schedule 10.06.2016

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

person MeBigFatGuy    schedule 10.06.2011

Проверяются все подклассы Throwable, кроме подклассов Error и RuntimeException. (Вы можете напрямую создать подкласс Throwable)

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

e.g.

public static void throwChecked(Throwable t) /* no throws clause */ {
    Thread.currentThread().stop(t);
}

public static void main(String... args) /* no throws clause */ {
    throwChecked(new Throwable());
}

Это компилирует и печатает Throwable, как и следовало ожидать.

person Peter Lawrey    schedule 10.06.2011
comment
Этот метод устарел более десяти лет назад и будет удален в будущих выпусках. Никогда не следует использовать. docs.oracle .com/javase/9/docs/api/java/lang/ - person Miha_x64; 22.10.2017
comment
@Miha_x64 Miha_x64 был отключен в Java 8. Есть и другие способы сделать то же самое, и этот ответ следует обновить. - person Peter Lawrey; 22.10.2017

Я думаю, вам следует сделать шаг назад и изучить теорию, лежащую в основе почему генерировать проверенное исключение, а не непроверенное исключение. руководство по Java по исключениям — хороший ресурс.

Со страницы под названием Непроверенные исключения — противоречие:

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

person Gyan aka Gary Buyn    schedule 10.06.2011

Исключения, расширяющие RuntimeException, объявлять не нужно.

Вы можете объявить метод: throws Exception или даже throws Throwable, и это нужно будет обработать (хотя это не рекомендуется).

person amit    schedule 10.06.2011