将 Null-Object 拆箱为基元类型会导致 NullPointerException,好吗?

2022-08-31 17:48:02

这个代码段抛出了一个事实,因为它被解框为基元类型并被调用,对吧?NullPointerExceptionLong.longValue()

如果你有这样的片段,这甚至很容易看到:

long value = (Long) null;

但是,在像这样的更复杂的情况下,更难获得:NullPointerException

long propertyValue = (Long) obj.getProperty(propertyModel.getName());

那么,Java编译器难道没有可能从中做出一个更舒适的例外吗?我更喜欢带有类似“您正在尝试将空对象转换为基元类型,这无法完成!”IllegalArgumentException

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

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


答案 1

根据 Java 语言规范,通过调用 、 等进行拆箱。没有特殊的字节码魔术发生,这与手动调用这些方法完全相同。因此,这是拆箱的自然结果(实际上是由JLS强制要求的)。Number.longValue()Number.intValue()NullPointerExceptionnull

引发不同的异常需要在每次拆箱转换期间检查两次(一次用于确定是否引发特殊异常,一次是在实际调用方法时隐式检查)。我想语言设计师认为它不够有用,不足以保证这一点。null


答案 2

从Java 8 SE开始,还有Sportable.ofNullable。

long value = Optional.ofNullable(obj.getProperty(propertyModel.getName())).orElse(0L)));

推荐