Вступление: Ваш проект на 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 очень строг к аннотациям (например,
@Nullablevs@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 для красоты