IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Kotlin Discussion :

Problème de "null"


Sujet :

Kotlin

  1. #1
    Membre régulier
    Homme Profil pro
    Hobby
    Inscrit en
    août 2002
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Hobby

    Informations forums :
    Inscription : août 2002
    Messages : 105
    Points : 76
    Points
    76
    Par défaut Problème de "null"
    Bonjour,

    Pourquoi la ligne 5 est-elle refusée par le compilateur avec le message "Kotlin: Unresolved reference: length"...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    fun main(args: Array<String>) {
        var nom: String? = "Toto"
        nom = null
        var longueur = nom!!.length		// Refusé par le compilateur...
    }
    ... alors que la ligne 4 est acceptée ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    fun main(args: Array<String>) {
        var nom: String? = null
        var longueur = nom!!.length		// Accepté par le compilateur...
        println("Longueur : $longueur")
    }

    Merci pour votre aide.

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    février 2009
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : février 2009
    Messages : 144
    Points : 208
    Points
    208
    Par défaut
    Bonjour,

    Visiblement le compilateur fait une différence lorsque l'assignation de la variable est effectuée en même temps que sa déclaration (même ligne) et lorsque l'assignation est effectuée plus tard (autre ligne).
    Pire, déclarer "nom" en "val", qui implique que "nom" restera définitivement "null" est même possible :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    fun main(args: Array<String>) {
        val nom: String? = null
        var longueur = nom!!.length
    }
    Reste que l'utilisation de l'opérateur "!!" se fait à ses risques et périls, le développeur étant censé être certain que sa variable n'est pas "null".
    La doc Kotlin est claire sur le sujet et ne manque pas d'humour (NPE pour Null Pointer Exception) :
    Operator !! is for NPE-lovers: the not-null assertion operator (!!) converts any value to a non-null type and throws an exception if the value is null.
    Thus, if you want an NPE, you can have it, but you have to ask for it explicitly, and it does not appear out of the blue.


    La méthode recommandée pour éviter la NPE est l'utilisation de l'opérateur "?" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    fun main(args: Array<String>) {
        val nom: String? = null
        var longueur = nom?.length 
        println("Longueur : $longueur")
        println("nom : $nom")
    }
    Les deux "print" produisant une sortie "null"

  3. #3
    Membre régulier
    Homme Profil pro
    Hobby
    Inscrit en
    août 2002
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Hobby

    Informations forums :
    Inscription : août 2002
    Messages : 105
    Points : 76
    Points
    76
    Par défaut
    @Krantz
    Merci pour cette explication et d'avoir pris le temps de me répondre !

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo