5.03. Иерархия исключений в Java
Иерархия исключений в Java
В Java все исключения являются объектами, наследующими от класса java.lang.Throwable. Иерархия ошибок строго типизирована и разделена на две основные ветви: исключения (Exception) и ошибки (Error). Обе наследуются от Throwable.
Иерархия исключений в Java (актуально для Java 17–21, стандартная библиотека)
Корневой класс:
java.lang.Throwable
Основные подклассы Throwable:
java.lang.Error— указывает на серьёзные проблемы, которые обычно не следует обрабатывать (например, сбои виртуальной машины).java.lang.Exception— базовый класс для всех обрабатываемых исключений.
1. Подклассы java.lang.Error (не предназначены для перехвата в обычном коде)
AssertionErrorLinkageErrorBootstrapMethodErrorClassCircularityErrorClassFormatErrorUnsupportedClassVersionError
IncompatibleClassChangeErrorAbstractMethodErrorIllegalAccessErrorInstantiationErrorNoSuchFieldErrorNoSuchMethodErrorVerifyError
NoClassDefFoundErrorUnsatisfiedLinkError
OutOfMemoryErrorStackOverflowErrorVirtualMachineErrorInternalErrorOutOfMemoryErrorStackOverflowErrorUnknownError
Примечание:
OutOfMemoryErrorиStackOverflowErrorнаследуются отVirtualMachineError, который, в свою очередь, наследуется отError.
2. Подклассы java.lang.Exception
2.1. Проверяемые исключения (checked exceptions) — обязательны к обработке или объявлению
ClassNotFoundExceptionCloneNotSupportedExceptionIllegalAccessExceptionInstantiationExceptionInterruptedExceptionNoSuchFieldExceptionNoSuchMethodExceptionReflectiveOperationException(родитель для нескольких рефлексивных исключений)ClassNotFoundExceptionIllegalAccessExceptionInstantiationExceptionInvocationTargetExceptionNoSuchFieldExceptionNoSuchMethodException
IOException(и множество подклассов)EOFExceptionFileNotFoundExceptionInterruptedIOExceptionSocketTimeoutException
MalformedURLExceptionProtocolExceptionHttpRetryExceptionUnknownServiceException
SecurityException(примечание: см. ниже)SyncFailedExceptionUnknownHostExceptionURISyntaxException- и др. (более 50 подклассов в
java.io,java.net,java.nio)
Примечание:
SecurityExceptionтехнически наследуется отRuntimeException, несмотря на название.
2.2. Непроверяемые исключения (unchecked exceptions) — наследуются от RuntimeException
ArithmeticExceptionArrayIndexOutOfBoundsExceptionArrayStoreExceptionBufferOverflowExceptionBufferUnderflowExceptionClassCastExceptionConcurrentModificationExceptionIllegalArgumentExceptionNumberFormatExceptionIllegalFormatException
IllegalCallerExceptionIllegalMonitorStateExceptionIllegalStateExceptionIndexOutOfBoundsExceptionArrayIndexOutOfBoundsExceptionStringIndexOutOfBoundsException
NegativeArraySizeExceptionNullPointerExceptionSecurityExceptionStringIndexOutOfBoundsExceptionTypeNotPresentExceptionUnsupportedOperationException
Важные особенности:
- Проверяемые исключения (
checked) — все подклассыException, кромеRuntimeExceptionи его потомков. Компилятор требует их обработки (try-catch) или объявления в сигнатуре метода (throws). - Непроверяемые исключения (
unchecked) —RuntimeExceptionи его подклассы, а также всеError. Не требуют явной обработки. - Исключения из пакетов
java.util,java.lang,java.timeи т.д. обычно непроверяемые. - Многие исключения в
java.ioиjava.net— проверяемые.
Как получить список программно (ограничения):
Java не предоставляет простого способа перечислить все встроенные исключения, так как они распределены по разным пакетам (java.lang, java.io, java.net, java.util.concurrent и др.). Однако можно использовать reflection для анализа загруженных классов, но это не гарантирует полноты без сканирования всех JAR-файлов JDK.