Je sais que lorsque je lirai la réponse à cette question, je verrai que j'ai négligé quelque chose qui était sous mes yeux. Mais j'ai passé les 30 dernières minutes à essayer de le découvrir par moi-même sans résultat.
J'écrivais un programme en Java 6 et j'ai découvert une fonctionnalité (pour moi) étrange. Afin d'essayer de l'isoler, j'ai fait deux petits exemples. J'ai d'abord essayé la méthode suivante :
private static int foo()
{
return null;
}
et le compilateur l'a refusé : Type mismatch : cannot convert from null to int.
Cela me convient et respecte la sémantique Java que je connais. J'ai ensuite essayé ce qui suit :
private static Integer foo(int x)
{
if (x < 0)
{
return null;
}
else
{
return new Integer(x);
}
}
private static int bar(int x)
{
Integer y = foo(x);
return y == null ? null : y.intValue();
}
private static void runTest()
{
for (int index = 2; index > -2; index--)
{
System.out.println("bar(" + index + ") = " + bar(index));
}
}
Cela compile sans aucune erreur ! Mais, à mon avis, il devrait y avoir une erreur de conversion de type dans la ligne
return y == null ? null : y.intValue();
Si j'exécute le programme, j'obtiens le résultat suivant :
bar(2) = 2
bar(1) = 1
bar(0) = 0
Exception in thread "main" java.lang.NullPointerException
at Test.bar(Test.java:23)
at Test.runTest(Test.java:30)
at Test.main(Test.java:36)
Pouvez-vous expliquer ce comportement ?
Mise à jour
Merci beaucoup pour les nombreuses réponses éclairantes. J'étais un peu inquiet car cet exemple ne correspondait pas à mon intuition. Une chose qui me perturbait était qu'un null était converti en un int et je me demandais quel serait le résultat résultat : 0 comme en C++ ? Cela aurait été très étrange. C'est bien que la conversion ne soit pas possible au moment de l'exécution (exception de pointeur nul).