Почини компиляцию Kotlin в Android: разбор ошибки compileDebugKotlin

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Вступление: Ваш проект на Kotlin внезапно сломался? Не паникуйте!

Вы пишете код на Kotlin, всё работает, и вдруг — бах! — при сборке вылетает красная надпись: Error:Execution failed for task ':app:compileDebugKotlin'. > Compilation error. See log for more details. Если вы хоть раз сталкивались с Android-разработкой, то знаете это чувство, когда Gradle внезапно решает, что сегодня не его день. Эта ошибка — одна из самых популярных на Stack Overflow, и сегодня мы разберем её от и до.

В этом туториале мы не просто скопируем ответ из интернета. Мы поймем, почему Kotlin иногда отказывается компилироваться, и научимся чинить это быстро и безболезненно. Поехали!

Что на самом деле означает эта ошибка?

Давайте сразу к делу. Сообщение Execution failed for task ':app:compileDebugKotlin'. > Compilation error говорит нам, что компилятор Kotlin нашел в вашем коде что-то, что ему не нравится. Самое коварное — часто Android Studio пишет это общее сообщение, а конкретную причину прячет в логах. Фраза "See log for more details" — это не пустые слова. Именно в логах (Build Output или Run) нужно искать настоящую проблему.

Но не спешите листать логи. Есть несколько типичных сценариев, которые вызывают эту ошибку в 90% случаев.

Основные причины (список для самодиагностики)

  • Несовместимость версий Kotlin и Gradle плагина. Это классика. Вы обновили Kotlin, но забыли обновить плагин в build.gradle — и получили ошибку.
  • Конфликт аннотаций. Kotlin очень строг к аннотациям (например, @Nullable vs @NotNull). Неправильное использование может сломать компиляцию.
  • Неправильный JVM Target. Если вы используете фичи из новой версии Kotlin, но JVM target старый, компилятор ругнется.
  • Проблемы с кэшем. Да, Gradle и Android Studio иногда "забывают", что вы исправили ошибку, и продолжают показывать старую.
  • Синтаксические ошибки в Kotlin. Пропущенная скобка, неправильный тип — всё это может вызвать именно эту ошибку, хотя сообщение кажется общей проблемой сборки.

Шаг 1: Читаем логи правильно (главный навык разработчика)

Прежде чем что-то менять, откройте вкладку Build в Android Studio (обычно она внизу). Если там пусто, нажмите View → Tool Windows → Build. Ищите красные строки. Самая важная информация часто начинается с e: или error:.

Пример из реального лога:

e: /Users/user/Project/app/src/main/java/com/example/MainActivity.kt: (12, 5): Null can not be a value of a non-null type String

Видите? Компилятор честно говорит: "В строке 12, символ 5, ты пытаешься присвоить null переменной, которая не может быть null". Всё просто. Теперь вы знаете, где копать.

Шаг 2: Три самых частых решения (с кодом)

Давайте разберем каждый случай на примерах. Открываем ваш build.gradle (Module: app).

Решение №1: Обновляем Kotlin и Gradle плагин

Это первое, что нужно проверить. Убедитесь, что версия Kotlin в build.gradle (project-level) соответствует версии плагина.

// build.gradle (Project level)
buildscript {
    ext.kotlin_version = '1.9.22' // Проверьте актуальную версию на kotlinlang.org
    repositories {
        google()
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:8.2.2' // Версия Gradle должна быть совместима с Kotlin
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

Если вы используете Kotlin 1.8+, убедитесь, что Gradle плагин тоже не отстает. После обновления нажмите "Sync Now".

Решение №2: Исправляем JVM Target

Иногда ошибка возникает из-за того, что вы используете фичи, требующие более новую JVM. Добавьте в build.gradle (Module: app):

android {
    // ... ваш код ...
    kotlinOptions {
        jvmTarget = "17" // Или "1.8", если ваш проект старый, но лучше 17
    }
}

Почему это важно? Kotlin компилируется в байт-код JVM. Если вы используете inline функции или sealed классы, а target старый, компилятор упадет.

Решение №3: Чистим кэш (магический ритуал)

Если вы уверены, что код правильный, но ошибка всё равно вылезает, сделайте Build → Clean Project, затем Build → Rebuild Project. Если не помогло — идите дальше:

  • Закройте Android Studio.
  • Удалите папки .gradle и .idea в корне проекта.
  • Откройте проект заново. Gradle пересоздаст кэш.

Это реально помогает в случаях, когда ошибка была, вы её исправили, но Android Studio "запомнила" старую версию.

Шаг 3: Сложные случаи (для тех, кто любит покопаться)

Если простые решения не сработали, проблема может быть глубже. Рассмотрим пару примеров с кодом.

Пример 1: Конфликт аннотаций (Nullability)

Представьте, у вас есть Java-библиотека, которая возвращает @Nullable String. Вы используете её в Kotlin-коде без проверки на null.

// Java код (библиотека)
public class MyJavaClass {
    @Nullable
    public String getName() {
        return null; // Может вернуть null
    }
}

// Kotlin код (ваш)
fun main() {
    val obj = MyJavaClass()
    val name: String = obj.name // Ошибка! Kotlin не может присвоить nullable значение non-null типу
    println(name.length)
}

Компилятор выдаст: Error:Execution failed for task ':app:compileDebugKotlin'. > Compilation error. See log for more details.

Решение: Используйте безопасный вызов или явно укажите nullable тип:

val name: String? = obj.name // Теперь всё ок
println(name?.length ?: 0) // Elvis operator для красоты

Пример 2: П

Блоги

Рекомендаций по книгам