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