Какая разница между ключевыми словами throw и throws?android-44

В Java и Kotlin ключевые слова throw и throws связаны с обработкой исключений, но выполняют разные функции. Рассмотрим их подробно.


1. throw — Генерация исключения

Назначение:
Ключевое слово throw используется для явного выбрасывания исключения в коде. Оно прерывает нормальное выполнение программы и передает управление ближайшему подходящему блоку catch.

Пример в Java:

public void checkAge(int age) {
    if (age < 18) {
        throw new IllegalArgumentException("Возраст меньше 18"); // Явное выбрасывание исключения
    }
}

Пример в Kotlin:

fun checkAge(age: Int) {
    if (age < 18) {
        throw IllegalArgumentException("Возраст меньше 18") // Аналогично в Kotlin
    }
}

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

  • Может использоваться для кастомных исключений.
  • Прерывает выполнение метода (если исключение не перехвачено).

2. throws — Объявление исключений

Назначение:
Ключевое слово throws используется в сигнатуре метода, чтобы указать, что метод может выбросить определенные типы исключений. Это предупреждает вызывающий код о необходимости обработки или пробрасывания этих исключений.

Пример в Java:

public void readFile(String path) throws IOException, FileNotFoundException {
    if (!new File(path).exists()) {
        throw new FileNotFoundException("Файл не найден");
    }
    // Чтение файла...
}

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

  • Применяется только в Java. В Kotlin используется аннотация @Throws для совместимости с Java-кодом.
  • Если метод вызывает другой метод с throws, он должен либо обработать исключение, либо объявить его в своей сигнатуре.

Пример @Throws в Kotlin:

@Throws(IOException::class)
fun readFile(path: String) {
    if (!File(path).exists()) {
        throw IOException("Файл не найден")
    }
}

3. Сравнение throw и throws

Характеристика throw throws
Тип операцииВыполнение (генерация исключения)Объявление (указание возможных исключений)
Где используетсяВ теле метода/блока кодаВ сигнатуре метода (Java)
ОбязательностьОпционально (по необходимости)Обязательно, если метод не обрабатывает проверяемые исключения (Java)
Поддержка в KotlinДа (аналогично Java)Нет (используется @Throws для совместимости)


4. Практическое применение

  • throw:
    Используется для валидации входных данных, обработки ошибок бизнес-логики или принудительного прерывания выполнения.
    Пример:

    if (user == null) {
        throw new UserNotFoundException("Пользователь не найден");
    }
    
  • throws:
    Применяется в методах, которые работают с внешними ресурсами (файлы, сеть), чтобы предупредить об ошибках времени выполнения.
    Пример:

    public void connectToDatabase(String url) throws SQLException {
        // Код подключения к БД
    }
    

Резюмируем:

  • throwгенерирует исключение в коде.
  • throwsдекларирует возможные исключения метода (актуально для Java).
  • В Kotlin вместо throws используется аннотация @Throws для взаимодействия с Java-кодом.