Глиф Учебники

Ошибка Unresolved reference

Справочник · Kotlin · 2 минуты чтения

Unresolved reference значит «компилятор не нашёл такого имени»: переменной, функции, класса или свойства. После слов Unresolved reference в сообщении стоит само имя, а рядом — файл и номер строки. В IntelliJ IDEA и Android Studio такое имя подсвечено красным ещё до сборки.

Причины по порядку проверки

Проверяйте по очереди, пока имя не перестанет подсвечиваться красным. В Android Studio загляните ещё в раздел В Android Studio.

  1. Опечатка

    printn вместо println, lenght вместо length. Сравните имя в сообщении с тем, что хотели написать. Подсказки редактора (Ctrl+Пробел) помогают не ошибаться.

    Имя исправлено, и красная подсветка пропала — причина была в опечатке.

    Не помогло — дальше: «Большие и маленькие буквы»

  2. Большие и маленькие буквы

    Kotlin их различает: Println, string или readLN — это уже другие имена. Правильно: println, String, readln.

    Имя написано теми же буквами, что в Kotlin, — ошибка ушла.

    Не помогло — дальше: «Забытый import»

  3. Забытый import

    Часть функций и классов нужно подключить строкой в начале файла:

    Kotlin
    import kotlin.math.sqrt
    import kotlin.random.Random
    
    fun main() {
        println(sqrt(16.0))
        println(Random.nextInt(1, 2))
    }
    Вывод
    4.0
    1

    Random.nextInt(1, 2) — число от 1 до 1, поэтому вывод всегда один и тот же. Без строк import компилятор не знает sqrt и Random. В IntelliJ IDEA курсор на красном имени и Alt+Enter предлагают подключить нужное (выбирайте kotlin.…, а не похожие классы Java, если не уверены).

    Чтоimport
    sqrt, abs, pow, roundToInt, PIkotlin.math.…
    Randomkotlin.random.Random
    Localejava.util.Locale
    Filejava.io.File

    println, readln, listOf, mutableListOf и большинство функций строк и списков подключены всегда.

    После строки import имя больше не подсвечено красным.

    Не помогло — дальше: «Переменная вне своего блока»

  4. Переменная вне своего блока

    Переменная, объявленная внутри { } — в if, цикле, функции, — снаружи не видна:

    Kotlin
    fun main() {
        val n = 5
        if (n > 0) {
            val message = "positive"
        }
        println(message)
    }

    Последняя строка не соберётся: message живёт только внутри if. Объявите переменную до блока или используйте if как выражение: val message = if (n > 0) "positive" else "not positive".

    Переменная объявлена там, где её видно, — println(message) собирается.

    Не помогло — дальше: «У этого типа нет такой функции или свойства»

  5. У этого типа нет такой функции или свойства

    listOf(3, 1).sort() — у списка только для чтения нет sort(); val n = 5 и n.length — у числа нет длины, она есть у строки. Проверьте тип переменной: в IntelliJ IDEA он виден при наведении мыши на имя.

    Вызвана функция, которая есть у этого типа, — ошибка ушла.

    Не помогло — дальше: «Функция объявлена в другом месте»

  6. Функция объявлена в другом месте

    Функция внутри другой функции видна только в ней; функция из другого пакета (package в начале файла) требует import.

    Функция вызывается там, где она видна, или подключена через import, — ошибка ушла.

В Android Studio

В Java похожая ошибка называется cannot find symbol — причины те же.