Какая разница между Error и Exception?android-35

В Java и Kotlin (которые используются в Android-разработке) Error и Exception являются подклассами Throwable, но имеют принципиальные различия в использовании и обработке.

1. Иерархия

Throwable
├── Error
├── Exception
│   ├── RuntimeException (Unchecked Exception)
│   └── Checked Exception (например, IOException)

2. Exception

  • Предназначение: Обрабатываемые ошибки в работе программы
  • Типы:
    • Checked Exceptions - проверяются на этапе компиляции (например, IOException)
    • Unchecked Exceptions (RuntimeException и его потомки) - не проверяются компилятором
// Пример обработки Exception
try {
    val file = File("missing.txt").readText()
} catch (e: IOException) {
    // Восстанавливаемся после ошибки
    println("File not found")
}

3. Error

  • Предназначение: Критические ошибки, которые обычно невозможно/не нужно обрабатывать
  • Примеры: OutOfMemoryError, StackOverflowError, LinkageError
  • Особенности:
    • Не проверяются компилятором
    • Обычно указывают на проблемы JVM или системы
    • Попытка обработки часто бессмысленна
// Пример Error (не пытайтесь так делать!)
try {
    methodCausingStackOverflow();
} catch (StackOverflowError e) {
    // Бессмысленная обработка - программа уже в нерабочем состоянии
}

Ключевые различия

Критерий Exception Error
ПроисхождениеОшибки приложенияСистемные/виртуальной машины
ОбработкаДолжны обрабатыватьсяОбычно не обрабатываются
ПроверкаChecked - да, Unchecked - нетНе проверяются
ВосстановлениеВозможноОбычно невозможно
ПримерыIOException, NullPointerExceptionOutOfMemoryError, NoClassDefFoundError

Когда что использовать?

  • Exception - для ошибок, от которых можно восстановиться (нет файла, нет сети)
  • Error - для фатальных ошибок (закончилась память)

Android-специфика

В Android особенно важно:

  1. Не ловить OutOfMemoryError - вместо этого использовать try-catch для больших операций с памятью
  2. Различать RuntimeException (например, NullPointerException) и проверяемые исключения

Резюмируем:

Exception - это ожидаемые проблемы в работе программы, которые можно обработать, а Error - критические системные сбои, которые обычно не обрабатываются.