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
>
>
>