Как создать метод для исключения в java? - PullRequest
0 голосов
/ 28 марта 2020

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

Метод throwException

  • Должен принимать объект Exception в качестве единственного параметра и ничего не возвращать
  • Возьми это исключение и брось его

Как создать этот метод?

То, что у меня пока есть:

public void throwException (Exception ex) throws Exception {
}

- это это правильно?

1 Ответ

1 голос
/ 28 марта 2020

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

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

public void throwException (Exception ex) throws Exception {
    //some other code maybe?
    throw ex;
}

Эта реализация имеет небольшой недостаток. Когда null передается ему в качестве параметра, метод генерирует исключение NullPointerException, поскольку ключевое слово throw принимает объекты класса Throwable или его подклассов (исключение является подклассом Throwable).
Чтобы избежать исключения NullPointerException (что является непроверенным исключением), можно использовать простой оператор if:

public void throwException (Exception ex) throws Exception {
    if (ex != null) {
        throw ex;
    }
    //just for presentation,below it throws new Exception
    throw new Exception("ex parameter was null");
}

Редактировать:
Как подсказал @Slaw, в этом очень маленьком случае добавление нулевой проверки и добавление нового Исключение просто маскирует исключение NullPointerException. Без проверки нуля и throw new... NPE будет выброшен из этого метода, а его трассировка стека покажет точную строку throw ex, когда значение NULL передается этому методу.
NPE является подтипом класса RuntimeException и подтипы RuntimeException не нужно явно объявлять в сигнатуре метода, когда они выбрасываются из этого метода. Как здесь:

public static void throwNPE(Exception e) {
    throw new NullPointerException();
}

RuntimeException и его подклассы называются непроверенными исключениями. Другие классы, расширяющие один из классов Exception или Throwable, называются проверяемыми-исключениями, потому что если метод их выбрасывает, он должен объявить это исключение (или суперкласс) в сигнатуре или явно попытаться перехватить его.

Правильное использование null-check было бы, когда метод генерировал бы более конкретный тип c исключения (например, IOException или новый подкласс Exception / Throwable) и когда другой метод использовал один который генерирует этот новый тип Exception, будет пытаться перехватить этот специфицированный c тип, который NPE не будет пойман.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...