Как мы создаем пользовательские исключения в Java?
Как мы создаем пользовательские исключения в Java?
Ответы:
Чтобы определить проверенное исключение, вы создаете подкласс (или иерархию подклассов) из 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
, что может привести к тому, что вы ловите Error
s в дополнение к Exception
s.
Для проверенного исключения:
public class MyCustomException extends Exception { }
Технически все, что расширяется, Throwable
может быть выброшено, но исключения, как правило, являются расширениями Exception
класса, так что они являются проверенными исключениями (за исключением RuntimeException или классов на его основе, которые не проверяются), в отличие от другого распространенного типа throwable, Error
s, которые обычно не предназначены для изящной обработки за пределами внутреннего пространства JVM.
Вы также можете сделать исключения не общедоступными, но тогда вы можете использовать их только в пакете, который их определяет, в отличие от разных пакетов.
Что касается выдачи / перехвата пользовательских исключений, они работают так же, как встроенные - бросить через
throw new MyCustomException()
и поймать через
catch (MyCustomException e) { }
Throwable
может быть брошено ; исключения распространяются Exception
. Пользовательский подкласс Throwable не будет перехвачен try { ... } catch (Exception e) { ... }
блоком.
Error
это не исключение, это ошибка). 3) Это подразумевает, что любой подкласс Exception проверяется, а RuntimeException - нет. Ответ, данный Адамским, гораздо точнее!