Почему компиляция nullable cursor.getString () для ненулевой String компилируется? - PullRequest
0 голосов
/ 09 марта 2019

У меня есть этот код:

data class Site(val apikey: String, val id: Int) {
    companion object {
        val INVALID = Site("", 0)
    }

    lateinit var name: String
    lateinit var city: String
    lateinit var country: String
}

, затем, позже в моем коде, я присваиваю site.city значение из базы данных SQLite:

site.city = cursor.getString(3)

Я бы предположил этоне компилируется, потому что cursor.getString возвращает обнуляемый String, а строки Котлина по умолчанию не обнуляются.Тем не менее, это хорошо компилируется, но вылетает во время выполнения с:

java.lang.IllegalStateException: cursor.getString (3) не должно быть нулевым

, потому что cursor.getString(3)возвращает null (что действительно, данные отсутствуют в базе данных).Я проверил в отладчике, и вызов getString() работает нормально.

1 Ответ

2 голосов
/ 09 марта 2019

Если Java-метод не аннотирован ни @Nullable, ни @NonNull, Kotlin будет обрабатывать его как тип платформы и позволит назначить его как обнуляемым, так и ненулевым переменным, в на ваше усмотрение. Вы должны использовать правильные типы.

В конкретном случае метода Cursor getString он никоим образом не аннотирован и не должен быть - документация гласит, что реализации интерфейса Cursor могут выбрать выдают ли они исключения или возвращают null в случае ошибки:

Результат и определение того, вызывает ли этот метод исключение, когда значение столбца равно нулю или тип столбца не является строковым типом, определяется реализацией.

...