Как создать пользовательские исключения в Java?

Как создать пользовательские исключения в Java?

Ответ 1

Чтобы определить исключение checked, вы создаете подкласс (или иерархию подклассов) java.lang.Exception. Например:

public class FooException extends Exception {
  public FooException() { super(); }
  public FooException(String message) { super(message); }
  public FooException(String message, Throwable cause) { super(message, cause); }
  public FooException(Throwable cause) { super(cause); }
}

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

public void calculate(int i) throws FooException, IOException;

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

try {
  int i = 5;
  myObject.calculate(5);
} catch(FooException ex) {
  // Print error and terminate application.
  ex.printStackTrace();
  System.exit(1);
} catch(IOException ex) {
  // Rethrow as FooException.
  throw new FooException(ex);
}

В приведенном выше примере вы заметите, что IOException пойман и обновлен как FooException. Это общий метод, используемый для инкапсуляции исключений (обычно при реализации API).

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

public class FooRuntimeException extends RuntimeException {
  ...
}

Методы могут вызывать или распространять исключение FooRuntimeException без объявления его; например.

public void calculate(int i) {
  if (i < 0) {
    throw new FooRuntimeException("i < 0: " + i);
  }
}

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

Класс java.lang.Throwable является корнем всех ошибок и исключений, которые могут быть выбраны внутри Java. java.lang.Exception и java.lang.Error - оба подкласса Throwable. Все, что подклассы Throwable могут быть выброшены или пойманы. Тем не менее, как правило, неправильная практика заключается в том, чтобы ловить или бросать Error, поскольку это используется для обозначения внутренних ошибок JVM, которые обычно не обрабатываются "программистом (например, OutOfMemoryError). Аналогично вам следует избегать ловли Throwable, что может привести к ловле Error в дополнение к Exception s.

Ответ 2

public class MyException extends Exception {
        // special exception code goes here
}

Бросьте его как:

 throw new MyException ("Something happened")

Поймать как:

catch (MyException e)
{
   // something
}

Ответ 3

За проверенное исключение:

public class MyCustomException extends Exception { }

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

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

Что касается метаданных/улавливания пользовательских исключений, он работает так же, как и встроенные - бросьте через

throw new MyCustomException()

и поймать через

catch (MyCustomException e) { }