Брось проверенные исключения - PullRequest
1 голос
/ 10 июня 2011

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

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

Спасибо!

Ответы [ 6 ]

6 голосов
/ 10 июня 2011

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

3 голосов
/ 10 июня 2011

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

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

, например

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, как вы могли ожидать.

3 голосов
/ 10 июня 2011

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

1 голос
/ 10 июня 2016

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

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;
    }
}
1 голос
/ 10 июня 2011

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

Со страницы, озаглавленной Непроверенные исключения - Противоречие :

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

0 голосов
/ 10 июня 2011

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

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

...