将Null-Object拆箱到原始类型导致NullPointerException,好吗?

Chr*_*wes 38 java nullpointerexception

这个片段引发了一个NullPointerException事实,即它被取消装入原始类型并被Long.longValue()调用,对吧?

如果你有一个这样的片段,这很容易看出来:

long value = (Long) null;
Run Code Online (Sandbox Code Playgroud)

但是NullPointerException更难以进入这样一个更复杂的情况:

long propertyValue = (Long) obj.getProperty(propertyModel.getName());
Run Code Online (Sandbox Code Playgroud)

因此,Java编译器是否有可能使这个更加舒适?我希望IllegalArgumentException有一条消息,比如"你正在尝试将null-Object转换为基本类型,这是不可能的!"

这不是更合适吗?你怎么看?这甚至可以在运行时?我们能够确定这个演员吗?我还没有看过java字节码.也许它可以用在解决方案中.

这个问题可以回答:我想知道是否有可能实现这种行为!

Mic*_*rdt 72

按照Java语言规范,拆箱通过调用发生Number.longValue(),Number.intValue()等没有特殊的字节码的魔法发生的事情,这是完全一样的,如果你手动调用这些方法.因此,这NullPointerException是取消装箱的自然结果null(实际上是由JLS强制要求).

抛出一个不同的异常需要在每次拆箱转换期间检查null 两次(一次确定是否抛出特殊异常,一次隐式实际调用该方法).我想语言设计师并不认为这有用.

  • 解释为什么会发生这种情况的一大优点 - 在null对象上调用longValue()或doubleValue()等方法.类似线程中的很多答案最终都说"因为取消装箱会抛出NullPointerException" (5认同)

olu*_*ies 13

从Java 8 SE开始,还有Optional.ofNullable

long value = Optional.ofNullable(obj.getProperty(propertyModel.getName())).orElse(0L)));
Run Code Online (Sandbox Code Playgroud)