Re: Une bien étrange NPE.

Benoît Dissert <[email protected]> Sat, 16 Apr 2011 10:13:13 +0200
Newsgroups gmane.comp.java.french.general
Message-ID <[email protected]>
Bonne question ... parce que c'est comme ça. Comme a dit Rémi, il n'y a pas
d'inférence de type
en Java, sauf pour les generics, parfois seulement. Quand les specs pour le
typage de l'opérateur ?:
ont été écrite, l'inférence de types n'était pas encore à la mode.

La règle est commutative, dans les deux cas, tu aurais eu un NPE.

Benoît

2011/4/15 Jean-Baptiste BRIAUD -- Novlog <[email protected]>

> Mais pourquoi convertir un Integer en int alors que c'est l'inverse qui
> doit être fait ???
>
> Est-ce que je dois déduire que c'était bon si j'avais écris : Integer i =
> (!b ? a.n() : 40)
>
> Genre il prend le premier terme du test pour trouver le type ?
>
> On 15 avr. 2011, at 22:35, Cédric Beust ♔ wrote:
>
> L'autoboxing essaie de convertir un Integer qui est null en int.
>
> --
> Cédric
>
>
> 2011/4/15 Jean-Baptiste BRIAUD -- Novlog <[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
>
>
>
>