Какая разница между checked и unchecked exception?android-36

В Java и Kotlin исключения делятся на два основных типа: checked (проверяемые) и unchecked (непроверяемые). Это фундаментальное разделение влияет на обработку ошибок в Android-приложениях.

1. Checked Exceptions

public void readFile() throws IOException {  // Обязательно объявляем в сигнатуре
    FileReader file = new FileReader("test.txt");
    // ...
}

Характеристики:

  • Проверка на этапе компиляции: Компилятор требует либо обработки в try-catch, либо объявления в сигнатуре метода
  • Наследуются от Exception, но не от RuntimeException
  • Использование: Для ожидаемых ошибок, которые можно обработать (файл не найден, сеть недоступна)
  • Примеры: IOException, SQLException, ClassNotFoundException

Особенности в Android:

  • Многие checked exceptions заменяются на unchecked в современных API
  • Например, Retrofit 2 вместо checked IOException использует runtime исключения

2. Unchecked Exceptions

fun divide(a: Int, b: Int): Int {
    if (b == 0) throw ArithmeticException()  // Не требуется объявлять
    return a / b
}

Характеристики:

  • Не проверяются компилятором - можно не обрабатывать и не объявлять
  • Наследуются от RuntimeException
  • Использование: Для ошибок программиста или системных проблем
  • Примеры: NullPointerException, ArrayIndexOutOfBoundsException, IllegalArgumentException

Android-специфика:

  • Большинство исключений в Android SDK - unchecked
  • ActivityNotFoundException, WindowManager.BadTokenException - типичные примеры

Сравнительная таблица

Критерий Checked Exception Unchecked Exception
Проверка компиляторомДаНет
НаследованиеException (но не RuntimeException)RuntimeException
ОбработкаОбязательнаОпциональна
Когда использоватьВосстановимые ошибкиОшибки программиста/системы
Примеры AndroidIOException (в старых API)NullPointerException, IllegalStateException

Практические советы для Android

  1. Modern Android Development:

    • Предпочитайте unchecked exceptions для большинства случаев
    • Используйте IllegalArgumentException для неверных параметров методов
  2. Обработка:

    • Checked: Обязательно обрабатывайте в IO операциях
    • Unchecked: Ловите только там, где можете восстановить состояние
// Правильный подход в современном Android
fun loadData() {
    try {
        networkRequest()  // Может бросить unchecked exception
    } catch (e: NetworkException) {
        showError(e)  // Восстановление UI состояния
    }
    // No need to catch RuntimeExceptions generally
}
  1. Kotlin особенность:
    • В Kotlin нет строгого требования обрабатывать checked exceptions
    • Но хорошей практикой остается обработка ожидаемых ошибок

Резюмируем:

Checked exceptions - для предсказуемых ошибок, требующих обязательной обработки, а unchecked - для ошибок, которые часто указывают на баги в коде. В современной Android-разработке предпочтение отдается unchecked подходам.