... и код, вызывающий этот метод, должен обрабатывать или распространять это исключение (или оба):
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.thrownewFooException(ex);}
Вы заметите в приведенном выше примере, что IOExceptionпойман и переброшен как FooException. Это распространенный метод, используемый для инкапсуляции исключений (обычно при реализации API).
Иногда возникают ситуации, когда вы не хотите заставлять каждый метод объявлять реализацию исключения в предложении throws. В этом случае вы можете создать непроверенное исключение. Непроверенное исключение - это любое исключение, которое расширяется java.lang.RuntimeException(которое само является подклассом java.lang.Exception):
Непроверенные исключения обычно используются для обозначения ошибки программиста, например, передача недопустимого аргумента методу или попытка нарушить границы индекса массива.
java.lang.ThrowableКласс является корнем всех ошибок и исключений , которые могут быть выброшены в Java. java.lang.Exceptionи java.lang.Errorоба подкласса Throwable. Все, что подклассы Throwableмогут быть брошены или пойманы. Однако, как правило, это плохая практика - перехватывать или выдавать, Errorпоскольку это используется для обозначения внутренних ошибок в JVM, которые обычно не могут быть «обработаны» программистом (например OutOfMemoryError). Точно так же вам следует избегать ловли Throwable, что может привести к тому, что вы ловите Errors в дополнение к Exceptions.
Технически все, что расширяется, Throwableможет быть выброшено, но исключения, как правило, являются расширениями Exceptionкласса, так что они являются проверенными исключениями (за исключением RuntimeException или классов на его основе, которые не проверяются), в отличие от другого распространенного типа throwable, Errors, которые обычно не предназначены для изящной обработки за пределами внутреннего пространства JVM.
Вы также можете сделать исключения не общедоступными, но тогда вы можете использовать их только в пакете, который их определяет, в отличие от разных пакетов.
Что касается выдачи / перехвата пользовательских исключений, они работают так же, как встроенные - бросить через
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 - идеальным решением было бы исправить неточности, нет? Во всяком случае, я исправил их сам, так как никто не сделал.
Ответы:
Чтобы определить проверенное исключение, вы создаете подкласс (или иерархию подклассов) из
java.lang.Exception
. Например:Методы, которые могут потенциально генерировать или распространять это исключение, должны объявить его:
... и код, вызывающий этот метод, должен обрабатывать или распространять это исключение (или оба):
Вы заметите в приведенном выше примере, что
IOException
пойман и переброшен какFooException
. Это распространенный метод, используемый для инкапсуляции исключений (обычно при реализации API).Иногда возникают ситуации, когда вы не хотите заставлять каждый метод объявлять реализацию исключения в предложении throws. В этом случае вы можете создать непроверенное исключение. Непроверенное исключение - это любое исключение, которое расширяется
java.lang.RuntimeException
(которое само является подклассомjava.lang.Exception
):Методы могут генерировать или распространять
FooRuntimeException
исключение, не объявляя его; напримерНепроверенные исключения обычно используются для обозначения ошибки программиста, например, передача недопустимого аргумента методу или попытка нарушить границы индекса массива.
java.lang.Throwable
Класс является корнем всех ошибок и исключений , которые могут быть выброшены в Java.java.lang.Exception
иjava.lang.Error
оба подклассаThrowable
. Все, что подклассыThrowable
могут быть брошены или пойманы. Однако, как правило, это плохая практика - перехватывать или выдавать,Error
поскольку это используется для обозначения внутренних ошибок в JVM, которые обычно не могут быть «обработаны» программистом (напримерOutOfMemoryError
). Точно так же вам следует избегать ловлиThrowable
, что может привести к тому, что вы ловитеError
s в дополнение кException
s.источник
Брось это как:
Поймать как:
источник
Для проверенного исключения:
Технически все, что расширяется,
Throwable
может быть выброшено, но исключения, как правило, являются расширениямиException
класса, так что они являются проверенными исключениями (за исключением RuntimeException или классов на его основе, которые не проверяются), в отличие от другого распространенного типа throwable,Error
s, которые обычно не предназначены для изящной обработки за пределами внутреннего пространства JVM.Вы также можете сделать исключения не общедоступными, но тогда вы можете использовать их только в пакете, который их определяет, в отличие от разных пакетов.
Что касается выдачи / перехвата пользовательских исключений, они работают так же, как встроенные - бросить через
и поймать через
источник
Throwable
может быть брошено ; исключения распространяютсяException
. Пользовательский подкласс Throwable не будет перехваченtry { ... } catch (Exception e) { ... }
блоком.Error
это не исключение, это ошибка). 3) Это подразумевает, что любой подкласс Exception проверяется, а RuntimeException - нет. Ответ, данный Адамским, гораздо точнее!