← Назад к вопросам

Какие знаешь наследники Throwable?

1.3 Junior🔥 91 комментариев
#JVM и память

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Наследники класса Throwable в Java (Android)

В Java и, соответственно, в Android-разработке класс Throwable является корневым классом всей иерархии исключений и ошибок. Все исключения и ошибки наследуются от него. Основное разделение происходит на два ключевых прямых наследника: Exception и Error. Давайте детально рассмотрим эту иерархию.

Основные ветви наследования от Throwable

java.lang.Throwable
├── java.lang.Exception
│   ├── java.lang.RuntimeException
│   │   ├── NullPointerException
│   │   ├── IndexOutOfBoundsException
│   │   ├── IllegalArgumentException
│   │   ├── IllegalStateException
│   │   └── ...
│   ├── IOException
│   │   ├── FileNotFoundException
│   │   └── EOFException
│   ├── ReflectiveOperationException
│   ├── SQLException
│   └── ...
└── java.lang.Error
    ├── VirtualMachineError
    │   ├── OutOfMemoryError
    │   ├── StackOverflowError
    │   └── ...
    ├── LinkageError
    └── ...

1. Класс Exception (Исключения)

Класс Exception и его наследники представляют условия, от которых разумное приложение может попытаться оправиться. Они делятся на две основные категории:

  • Проверяемые исключения (Checked Exceptions): Это все классы, наследующие от Exception, но НЕ от RuntimeException. Компилятор обязывает разработчика либо обработать их с помощью try-catch, либо объявить в сигнатуре метода с помощью throws. Типичные примеры:
    *   `IOException` и его наследники (`FileNotFoundException`, `SocketException`) — проблемы с вводом/выводом.
    *   `SQLException` — ошибки работы с базами данных.
    *   `ClassNotFoundException`, `NoSuchMethodException` — ошибки рефлексии.

  • Непроверяемые исключения (Unchecked Exceptions / Runtime Exceptions): Наследуются от RuntimeException. Компилятор не требует их обязательной обработки или объявления. Чаще всего являются следствием логических ошибок программиста.
    *   `NullPointerException`: попытка использовать `null` там, где требуется объект.
    *   `IndexOutOfBoundsException` (и его частный случай `ArrayIndexOutOfBoundsException`): выход за границы массива или коллекции.
    *   `IllegalArgumentException`: недопустимый аргумент, переданный методу.
    *   `IllegalStateException`: вызов метода в недопустимом состоянии объекта.
    *   `ClassCastException`: неудачное приведение типов.
    *   `ArithmeticException` (например, деление на ноль).
    *   В Android контексте также распространены `NetworkOnMainThreadException` (попытка сетевого вызова в UI-потоке) и `WindowManager.BadTokenException` (попытка показать диалог с невалидным токеном).

2. Класс Error (Ошибки)

Класс Error и его подклассы представляют серьезные проблемы, которые, как правило, приложение не должно пытаться обрабатывать, так как они часто связаны с неустранимыми сбоями в работе JVM (Java Virtual Machine) или системе. Они также являются непроверяемыми.

  • OutOfMemoryError: исчерпана доступная память Heap. В Android это критическая ситуация, которую система часто предваряет вызовом onTrimMemory().
  • StackOverflowError: переполнение стека вызовов, обычно из-за бесконечной рекурсии.
  • NoClassDefFoundError: JVM не смогла найти определение класса, который был доступен на этапе компиляции.
  • LinkageError: ошибка связывания классов.

Особенности и лучшие практики в Android

  1. Обработка исключений в UI-потоке: Необработанное исключение в главном потоке приведет к падению приложения с ANR (Application Not Responding) или немедленным крашем. Используйте try-catch для обработки потенциальных исключений в обработчиках кликов, асинхронных задач (AsyncTask, корутины, LiveData трансформации) и колбэках.
  2. Собственные исключения: Разработчики часто создают свои классы исключений, наследуя от Exception или RuntimeException, для описания специфичных для домена приложения ошибок (например, AuthException, InvalidDataFormatException).
  3. Crash-репортеры: Для отслеживания ошибок в продакшене используются библиотеки, такие как Firebase Crashlytics. Они перехватывают необработанные исключения (через Thread.setDefaultUncaughtExceptionHandler), отправляют отчет и позволяют приложению завершиться или попытаться восстановиться.
  4. throw vs throws: Ключевое слово throw используется для генерации экземпляра исключения, а throws — в объявлении метода, чтобы указать, какие проверяемые исключения он может выбросить.

Важно: Правильное использование иерархии исключений позволяет писать устойчивый, понятный и легко поддерживаемый код. Обработка Error в Android-приложениях, как правило, не рекомендуется — лучше позволить приложению завершиться и собрать информацию через crash-репортер для последующего анализа первопричины.