2
votes

Pourquoi ai-je ça? Kotlin: Incompatibilité de type: le type inféré est String? mais String était attendu

Quand j'essaye d'exécuter ce code:

fun main() {
    val input: String = readLine()
    val outputs = input.toCharArray()
    for (i in 0 until input.length) {
        print("${outputs[i]}${outputs[i]}")
    }
}

J'obtiens cette Error:(2, 25) Kotlin: Type mismatch: inferred type is String? but String was expected. Comment résoudre ce problème?


1 commentaires

readLine () renvoie String? ie String nullable. mettre un !! à l'arrière de l'appel readLine (), car il ne sera pas nul lorsque le flux est ouvert.


3 Réponses :


2
votes

La fonction readLine () renvoie une String? (chaîne nullable).

Renvoie la ligne lue ou nulle si le flux d'entrée est redirigé vers un fichier et que la fin du fichier a été atteinte.

Il n'y a pas de fin de fichier dans les entrées de la console, vous n'avez donc pas à vous soucier des valeurs nulles. Vous pouvez utiliser l'opérateur d'appel non sécurisé !! pour le convertir en une valeur String non nulle.

val input: String = readLine()!!


0 commentaires

0
votes

à Kotlin ? signifie que la variable peut avoir des valeurs nulles
comme readLine () peut retourner null vous obtenez l'erreur
essayez ce code:

fun main() {
    val input: String? = readLine()
    input?.let {
    val outputs = it.toCharArray()
        for (i in 0 until it.length) {
            print("${outputs[i]}${outputs[i]}")
        }
    } ?: run {
        print("input was null")
    }
}


0 commentaires

2
votes

Dans Kotlin, appeler une fonction sur un type Nullable en utilisant uniquement l'opérateur point est une erreur de compilation car cela pourrait provoquer une exception de pointeur Null. Afin d'éviter ce genre d'erreur, le compilateur vous oblige à vérifier si votre référence n'est pas nulle. Il est également possible d'utiliser l'opérateur d'appel sécurisé ?. . Je vous recommande de lire l'excellente documentation Kotlin sur le sujet: Null Safety .

Si vous avez commencé à utiliser Kotlin, je vous recommande également de commencer à écrire votre code de manière plus déclarative / fonctionnelle. Regardez comment il est possible d'accomplir ce que vous voulez d'une manière beaucoup plus simple:

fun main() {
    val input = readLine()
    input?.toCharArray()?.forEach { print(it) }
}


0 commentaires