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

Langage Java Discussion :

Erreur étrange de NullPointerException


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Août 2006
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 123
    Par défaut Erreur étrange de NullPointerException
    Bonjour,
    une NullPointerException que je trouve bizarre se produit dans le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    public class Tests {
    	public static void main(String[] args){
                 Test t  = new Test();
    	     Integer ts = t!=null?t.getNbr():0;  // ??
            }
    }
     
    class Test{
    		private Integer nbr;
     
    		public Integer getNbr() {
    			return nbr;
    		}
     
    		public void setNbr(Integer nbr) {
    			this.nbr = nbr;
    		}
    	}
    le probleme vient précisement de cette ligne
    Integer ts = t!=null?t.getNbr():0;

    En utilisant un if else à la place de l'opérateur ternaire, le code marche !!

  2. #2
    Modérateur

    Avatar de Robin56
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juin 2009
    Messages
    5 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juin 2009
    Messages : 5 297
    Par défaut
    Citation Envoyé par edogawa Voir le message
    le probleme vient précisement de cette ligne
    Integer ts = t!=null?t.getNbr():0;

    En utilisant un if else à la place de l'opérateur ternaire, le code marche !!
    Je n'ai pas trop compris ta notation mais en même temps j'ai envi de dire : Ne trouves tu pas un if else plus lisible et donc plus compréhensible par autrui ?

    PS : Je n'ai pas répondu à la question mais je ne doute pas que d'autre vont y répondre.
    Responsable Java de Developpez.com (Twitter et Facebook)
    Besoin d'un article/tutoriel/cours sur Java, consulter la page cours
    N'hésitez pas à consulter la FAQ Java et à poser vos questions sur les forums d'entraide Java
    --------
    Architecte Solution
    LinkedIn : https://www.linkedin.com/in/nicolascaudard/

  3. #3
    Membre Expert Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Par défaut
    Dans un premier temps remplace les Integer par des int.
    Pour ton problème je pencherais pour un problème de parenthèsage.
    Enfin, comme l'a signalé Robin56, un if/else sera plus lisible.

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 585
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 585
    Par défaut
    Pas de parenthésage, mais d'inférence de type.
    Un gros problème du mélange opérateur ternaire/inbox-outbox.

    En gros, vu qu'une des expressions possibles en résultat de l'opérateur est la constante 0, de type int, qui n'est pas un type objet, alors l'expression dans son ensemble est considérée de type int.

    Ce qui fait donc que l'autre résultat de l'opérateur, t.getNbr(), doit être converti au type int. Vu que t.getNbr() est de type Integer, la conversion se fait comme si c'était t.getNbr().intValue()

    Or, dans la classe Test, l'Integer nbr n'a jamais été initialisé, il est donc à null. Et appeler intValue() (ou n'importe quoi) sur un pointeur null, lance un NullPointerException.
    Voilà voilà.

    Correction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Integer nbr = t.getNbr();
    if(nbr == null) {
      nbr = 0;
    }
    Car ce n'est pas t dont nous devons vérifier s'il est null. Il vient d'être construit avec un new. Il ne peut pas possiblement être null. Son membre nbr peut l'être par contre. Et il l'est forcément si on ne l'initialise pas avant.

    Suggestion :
    - L'opérateur ternaire est le mal
    - Mêler l'opérateur ternaire avec des conversions implicites (telles que l'inbox-outbox,) c'est demander à l'ordinateur de te causer autant de problèmes qu'il le peut. (Valable pour tout langage typé.)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 127
    Par défaut
    Bonjour,

    Bien vu thelvin !

    Je rajouterais mon grain de sel en disant que l'auto-boxing est à mon sens une entorse aux règles de typage pas digne d'un langage comme java.
    C'est vrai que l'opérateur ternaire est une source d'ennuis qu'il est bon d'éviter, mais on peut pardonner son existence dans java, c'était pour ne pas effrayer ceux qui venaient du C/C++, par contre, l'auto-boxing est vraiment une transgression et même si c'était parfois contraignant de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Integer zero = new Integer(0)
    ça avait le mérite de bien montrer que Integer n'est pas un int.
    On voit d'ailleurs sur cet exemple que le diagnostic est compliqué.
    Je dirais donc que l'auto-boxing, sauf peut être pour initialiser une variable, "est aussi le mal".

    Cordialement

Discussions similaires

  1. Erreur étrange au moment de détruire la TForm
    Par Taka's tiger dans le forum C++Builder
    Réponses: 3
    Dernier message: 01/01/2007, 16h56
  2. Message d'erreur étrange sur mon serveur
    Par irnatene dans le forum Mandriva / Mageia
    Réponses: 3
    Dernier message: 28/11/2006, 14h20
  3. Message d'erreur étrange
    Par maitreblitosaure dans le forum Access
    Réponses: 10
    Dernier message: 29/06/2006, 11h45
  4. Probleme erreur java.lang.NullPointerException
    Par Tsukaasa dans le forum Langage
    Réponses: 4
    Dernier message: 25/05/2006, 18h19
  5. Erreur étrange sur recvfrom
    Par Gore dans le forum Développement
    Réponses: 2
    Dernier message: 17/02/2005, 12h22

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