Kev*_*vin 20 java nullpointerexception
今天早上我遇到了一个非常奇怪的NPE,并将其简化为一个简单的例子.这是JVM错误还是正确的行为?
public class Test1 {
class Item {
Integer id = null;
public Integer getId() {return id;}
}
public Integer f() {
Item item = new Item();
// this works:
//return item == null ? new Integer(1) : item.getId();
// NPE??
return item == null ? 1 : item.getId();
}
public static void main(String[] args) {
Test1 t = new Test1();
System.out.println("id is: " + String.valueOf(t.f()));
}
}
Run Code Online (Sandbox Code Playgroud)
编译和运行的输出:
$ javac Test1.java
$ java Test1
Exception in thread "main" java.lang.NullPointerException
at Test1.f(Test1.java:12)
at Test1.main(Test1.java:16)
$
Run Code Online (Sandbox Code Playgroud)
Jac*_*nds 32
类型表达的item == null ? 1 : item.getId()是int不Integer.因此,Java需要自动拆箱你Integer到int(导致NullPointerException).然后它自动将结果返回到一个Integer(如果不是这样的话NullPointerException),从方法返回.
另一方面,表达式item == null ? new Integer(1) : item.getId()具有一种类型,Integer并且不需要进行自动拆箱.
当您自动取消装箱a时null Integer,您会得到一个NullPointerException(请参阅自动装箱),这就是您所遇到的问题.
要回答您的问题,这是正确的行为.
| 归档时间: |
|
| 查看次数: |
1669 次 |
| 最近记录: |