【发布时间】:2018-07-01 16:33:27
【问题描述】:
观察到这种情况让我非常困惑:
Integer i = null;
String str = null;
if (i == null) { //Nothing happens
...
}
if (str == null) { //Nothing happens
}
if (i == 0) { //NullPointerException
...
}
if (str == "0") { //Nothing happens
...
}
所以,我认为首先执行装箱操作(即 java 尝试从 null 提取 int 值)并且比较操作的优先级较低,这就是引发异常的原因。
问题是:为什么在Java中以这种方式实现?为什么拳击比比较参考具有更高的优先级?或者为什么他们没有在拳击前对null 进行验证?
目前,当NullPointerException 与包装原语一起抛出而不是与 true 对象类型一起抛出时,它看起来不一致。
【问题讨论】:
-
如果你执行 str.equals("0"),你会得到一个 NullPointerException。
-
== 运算符曾经在任何情况下都被用来对抗 NPE。对我来说,这只是另一个例子,它展示了在 Java 中引入自动装箱是多么糟糕的主意。它只是因为很多原因不适合,并且没有提供以前没有的东西。它只会使代码更短,同时掩盖真正发生的事情。
-
我的想法相差 180 度。他们不应该在任何地方都包含原始使用的对象。然后让编译器优化和使用原语。这样就不会有任何混乱。
标签: java nullpointerexception boxing