Re: Une bien étrange NPE.
Rémi Forax <[email protected]> Sat, 16 Apr 2011 00:50:42 +0200
| Newsgroups | gmane.comp.java.french.general |
|---|---|
| Message-ID | <[email protected]> |
On 04/15/2011 10:42 PM, Benoît Dissert wrote: > Il faut se référer à la spec Java : > http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html > > section 15.25. > > Le type de retour de l'opérateur conditionnel est en l'occurence > imposé par le fait que 40 soit un int. > Du coup, le second est transformé en int par unboxing et c'est là que > tu as le NPE. > > Benoît > > PS : ça ressemble au Puzzler 8 de Josh Bloch, pour ceux qui ont le bouquin Oui, Java ne fait pas de 'target typing' pour les ?: pour Integer i = ...? ...: ...; le type de l'expression ?: ne dépend pas du type du résultat. A noter que le target typing en Java est fait uniquement (pour l'instant) avec les methodes generics et encore quand c'est pas trop compliqué (pas en argument de méthode). Rémi > > 2011/4/15 Cédric Beust ♔ <[email protected] <mailto:[email protected]>> > > L'autoboxing essaie de convertir un Integer qui est null en int. > > -- > Cédric > > > 2011/4/15 Jean-Baptiste BRIAUD -- Novlog <[email protected] > <mailto:[email protected]>> > > Juste un élément que j'ai oublié : > > Voici la ligne 2 : Integer i = (b ? 40 : a.n()) > > Le Integer i devant donner le signal pour l'autoboxing. > visiblement, la partie compila time dispose bien de l'info, > mais @runtime, çà plante. > Que çà plante ne me gène pas tellement, ce qui est troublant, > c'est le type de l'exception. > Pourquoi une NPE ? > > > On 15 avr. 2011, at 22:06, Jean-Baptiste BRIAUD -- Novlog wrote: > > > Bonjour à tous, > > > > Ca faisait très très longtemps que je n'avais pas eu de > problème de ce genre. > > > > Une NPE. > > Jusque là, rien à dire. > > J'investige ... et voici ce que je trouve (conceptuellement). > > > > ligne 1 : a.m(); > > ligne 2 : a.n(); > > > > Or la NPE est à la ligne 2 ! > > Donc a est nul, mais la ligne 1 est passé. > > > > Maintenant voici le détail de la ligne 2 : b ? 40 : a.n() > > > > La méthode n retourne un Integer... sauf que 40 est un int, > pas un Integer. > > Résultat, çà passe la compile depuis l'autoboxing, mais > visiblement pas le runtime. > > > > Correction de la ligne 2 : b ? new Integer(40) : a.n() > > Comme au bon vieux temps, sans autoboxing ... et çà passe. > > > > Etrange, non ? Serait-ce un bon puzzle ? > > Je suis en 1.6. > > > > > -- > Cédric > > >