Я знаю, что когда я прочитаю ответ на это, я увижу, что я что-то упустил это было у меня под глазами. Но последние 30 минут я пытался выяснить это сам без результата.
Итак, я писал программу на Java 6 и обнаружил некоторые (для меня) странные функции. Чтобы попытаться изолировать его, я сделал два небольших примера. Сначала я попробовал следующий метод:
private static int foo()
{
return null;
}
и компилятор отказался от него: Тип несоответствия: невозможно преобразовать из null в int.
Это хорошо со мной, и он уважает семантику Java, с которой я знаком. Затем я попробовал следующее:
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));
}
}
Это компиляция без ошибок! Но, на мой взгляд, должна быть ошибка преобразования типа в строке
return y == null ? null : y.intValue();
Если я запустил программу, я получаю следующий вывод:
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)
Можете ли вы объяснить это поведение?
Обновление
Большое спасибо за многие разъясняющие ответы. Я был немного обеспокоен, потому что этот пример не соответствовал моей интуиции. Одна вещь, которая меня беспокоила, была что null был преобразован в int, и мне было интересно, какой результат be: 0 как в С++? Это было бы очень странно. Хорошо, что преобразование невозможно во время выполнения (исключение нулевого указателя).