我知道,当我读到这个答案,我会看到,我已经忽视了一些东西
那是在我的眼睛下。但我花了最后30分钟试图弄清楚自己
没有结果。
所以,我在Java 6中编写一个程序,并发现了一些(对我来说)奇怪的功能。
为了尝试和隔离它,我做了两个小例子。
我第一次尝试以下方法:
private static int foo()
{
return null;
}
并且编译器拒绝它:类型mismatch:不能从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 like in C?这将是非常奇怪的。
很好,转换是不可能在运行时(空指针异常)。