Подтвердить что ты не робот

Можно ли игнорировать исключение?

В Java можно создать метод, для которого не установлен флажок throws.

Например:

public class TestClass {
    public static void throwAnException() throws Exception {
        throw new Exception();
    }
    public static void makeNullPointer() {
        Object o = null;
        o.equals(0);//NullPointerException
    }
    public static void exceptionTest() {
        makeNullPointer(); //The compiler allows me not to check this
        throwAnException(); //I'm forced to handle the exception, but I don't want to
    }
}
4b9b3361

Ответ 1

Вы можете ничего не попробовать:

public static void exceptionTest() {
    makeNullPointer(); //The compiler allows me not to check this
    try {
        throwAnException(); //I'm forced to handle the exception, but I don't want to
    } catch (Exception e) { /* do nothing */ }
}

Имейте в виду, что в реальной жизни это очень плохо информировано. Это может скрыть ошибку и держать вас в поиске собак целую неделю, в то время как проблема была действительно кошкой (ch). (Давай, поместите хотя бы System.err.println() там - здесь лучше всего вести журнал, как это предлагает @BaileyS.)

Исключенные исключения в Java расширяют класс RuntimeException. Бросание их не потребует catch от их клиентов:

// notice there no "throws RuntimeException" at the signature of this method
public static void someMethodThatThrowsRuntimeException() /* no need for throws here */ {
    throw new RuntimeException();
}

Классы, которые расширяют RuntimeException также не требуют объявления throws.

И слово от Oracle об этом:

Вот руководство к нижней строке: если клиент может разумно ожидать восстановления от исключения, сделайте это проверенным исключением. Если клиент не может ничего сделать для восстановления из исключения, сделайте его незафиксированным исключением.

Ответ 2

В Java существует два типа Exceptions, "Проверенные исключения" и "Непроверенные исключения".

  • Exception является проверенным исключением, должен быть пойман или брошен.
  • NullPointerException является RuntimeException, (компилятор не заставляет их быть объявленными в throws claus), вы можете его игнорировать, но это все равно может произойти в Runtime, и ваше приложение будет аварийно завершено.

Из Exception документация:

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

Из документа RuntimeException:

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

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

Ответ 3

Есть 3 вещи, которые вы можете сделать:

  • Выбросьте RuntimeException (или что-то, расширяющее RuntimeException, например NullPointerException, IllegalArgumentException,...), вам не нужно их улавливать, поскольку они исключены из исключения.

  • Поймать исключение и ничего не делать (не рекомендуется):

    public static void exceptionTest() {
        makeNullPointer(); //The compiler allows me not to check this
        try {
            throwAnException(); //I'm forced to handle the exception, but I don't want to
        } catch (Exception e) {
            // Do nothing
        }
    }
    
  • Измените объявление exceptionTest (), чтобы сказать, что он выбрал Exception, и пусть вызывающий его метод поймает Exception и сделает то, что подходит:

    public static void exceptionTest() throws Exception {
        makeNullPointer(); //The compiler allows me not to check this
        throwAnException(); //I'm no more forced to handle the exception
    }
    

Ответ 4

Вы можете использовать лазейку в компиляторе Java. Добавьте следующий код:

public RuntimeException hideThrow(Throwable e) {
    if (e == null)
        throw new NullPointerException("e");
    this.<RuntimeException>hideThrow0(e);
    return null;
}

@SuppressWarnings("unchecked")
private <GenericThrowable extends Throwable> void hideThrow0(Throwable e) throws GenericThrowable {
    throw (GenericThrowable) e;
}

Вы можете поймать исключение, а затем вызвать hideThrow с исключением, чтобы бросить его без hideThrow компилятора. Это работает из-за стирания типа. Во время компиляции GenericThrowable представляет RuntimeException потому что это то, что мы RuntimeException. Во время выполнения GenericThrowable представляет Throwable потому что это базовый тип в спецификации параметра типа.

Ответ 5

Нет, он вызывает ошибку компилятора. Являясь проверяемым исключением, вы должны либо поймать его, либо распространить его, объявив свой метод потенциально бросая его. Проверьте this и this.

Ответ 6

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

Ответ 7

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

Ответ 8

Другие ответы правильны, поскольку они правильно сообщают вам, что вы должны делать, но на самом деле возможно выбросить необъявленное проверенное исключение. Это можно сделать несколькими способами; самое простое:

public void methodThatSecretlyThrowsAnException() {
    Thread.currentThread().stop(new Exception());
}

или если ваша цель - обернуть существующий метод, который объявит свое исключение

public void methodThatSecretlyThrowsAnException() {
    try {
        methodThatAdmitsItThrowsAnException();
    } catch(final Exception e) {
        Thread.currentThread().stop(e);
    }
}

(Разумеется, вы никогда не должны этого делать.)

Ответ 9

Просто поймайте исключение и ничего не делайте с ним, оставьте его как есть и поймайте общее исключение, если вы не знаете конкретного исключения.

try{
//Your logic goes here
}
catch(Exception e)//Exception is generic
{
//do nothing
}

Ответ 10

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

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

Например:

private class UnlikelyException extends RuntimeException {
    public UnlikelyException (Exception e){
        super (e);
    }
}

Затем заверните свой код блоком try-catch и выбросите свое исключение, которое вам не нужно ловить

try {
    // Your code
} catch  (Exception e) {
    throw new UnlikelyException(e);
}