Выброс пользовательских исключений в Java

Почему мне нужно обернуть мои измененные пользовательские исключения с помощью try/catch во время попытки их бросить, но мне не нужно делать это для общих исключений? Как и в примере, мой подкласс Exception:

public class MyException extends Exception {
    public MyException(String msg) {
        super(msg);
    }
}

Отбрасывание исключений:

public class Exe {

    private static void testex(String test) {
        if (null!=test) {
            throw new UnsupportedAddressTypeException();
        } else {//Removing try/catch block results in compile failure
          try {
            throw new MyException("message");
          } catch (MyException e) {
            e.printStackTrace();
          }
        }
    }
}

Ответ 1

UnsupportedAddressTypeException - это подкласс RuntimeException и JavaDoc:

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

Не требуется метод объявлять в свойстве throws любые подклассы RuntimeException, которые могут быть выбраны во время выполнения метода, но не пойманы.

Ответ 2

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

изменить Изменены слова не должны на не требуется

Ответ 3

Ваш статический метод должен объявить

private static void testex(String test) throws MyException

если вы хотите, чтобы метод бросил его (и не ловить и обработать его внутренне).

Ответ 4

Из Java Tutorial:

Действительный код языка программирования Java должен соблюдать Catch или Specify Требование. Это означает, что код, который может бросать определенные исключения должен быть заключен в одно из следующих действий:

  • Оператор try, который ловит исключение. Попытка должна предоставить обработчик для исключения, как описано в разделе Catching and Handling Исключения.

  • Метод, который указывает, что он может генерировать исключение. Метод должен предоставить предложение throws, в котором указано исключение, как описано в Указание исключений, созданных методом.

Код, который не выполняет чек или Указать требование, не будет компиляции. Не все исключения подчиняются требованиям Catch или Specify Requirement.

[...]

Исключения времени выполнения не подпадают под действие Catch или Specify Requirement. Исключениями Runtime являются те, которые указаны в RuntimeException и его подклассах.