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

149

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

Суреш Чаганти
источник
2
Это та же методология, что и в большинстве языков OO: расширить базовый класс Exception.
NDM
2
Проверьте stackoverflow.com/questions/1070590/…
demongolem
1) // Класс, представляющий определенный пользователем класс исключений MyException extends Exception {public MyException (String s) {super (s); }} ------------------------------------------------ 2) try {// Бросить объект определенного пользователем исключения throw new MyException ("TestException"); } catch (MyException ex) {System.out.println ("Caught"); // Распечатать сообщение из объекта MyException System.out.println (ex.getMessage ()); }
Мандип Ядав

Ответы:

285

Чтобы определить проверенное исключение, вы создаете подкласс (или иерархию подклассов) из 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).

Иногда возникают ситуации, когда вы не хотите заставлять каждый метод объявлять реализацию исключения в предложении throws. В этом случае вы можете создать непроверенное исключение. Непроверенное исключение - это любое исключение, которое расширяется 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, что может привести к тому, что вы ловите Errors в дополнение к Exceptions.

Адамский
источник
25
public class MyException extends Exception {
        // special exception code goes here
}

Брось это как:

 throw new MyException ("Something happened")

Поймать как:

catch (MyException e)
{
   // something
}
Лора
источник
4

Для проверенного исключения:

public class MyCustomException extends Exception { }

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

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

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

throw new MyCustomException()

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

catch (MyCustomException e) { }
янтарный
источник
4
RuntimeException расширяет Exception и не является проверенным исключением.
Адамски
2
Технически, все, что расширяется, Throwableможет быть брошено ; исключения распространяются Exception. Пользовательский подкласс Throwable не будет перехвачен try { ... } catch (Exception e) { ... }блоком.
Анджей Дойл
Почему люди голосуют против этого ответа? Содержит несколько неточностей. 1) Вы не можете implmenet бросить, поскольку это интерфейс. 2) Все, что расширяет Throwable, НЕ является исключением ( Errorэто не исключение, это ошибка). 3) Это подразумевает, что любой подкласс Exception проверяется, а RuntimeException - нет. Ответ, данный Адамским, гораздо точнее!
oxbow_lakes
К сожалению, я имел в виду, что throwable это не интерфейс, конечно!
oxbow_lakes
@oxbow_lakes - идеальным решением было бы исправить неточности, нет? Во всяком случае, я исправил их сам, так как никто не сделал.
Январь