当前位置: 首页 > 面试题库 >

将Null-Object取消装箱成原始类型会导致NullPointerException,好吗?

卜弘文
2023-03-14
问题内容

NullPointerException由于该片段未装箱成原始类型,因此Long.longValue()被称为是,所以抛出了一个片段。

甚至很容易看出您是否有如下代码段:

long value = (Long) null;

但是在NullPointerException像这样的更复杂的情况下更难实现:

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

那么Java编译器是否有可能因此而做出更舒适的Exception?我更喜欢这样IllegalArgumentException的消息,例如
“您正在尝试将null对象转换为原始类型,这无法完成!”

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

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


问题答案:

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

引发不同的异常将需要在每次拆箱转换期间检查null 两次
(一次以确定是否引发特殊异常,而在实际调用该方法时隐式地进行一次检查)。我想语言设计者认为它没有足够的用处。



 类似资料:
  • 可以是任何类,甚至可以是。如果是值类型,执行上面的检查是否会导致装箱?我的理解是,这与调用相同,后者接受两个参数,如果是值类型,如果我理解正确的话,这两个参数中的任何一个都会导致装箱。 如果上述情况确实导致装箱,是否有更好的方法来做到这一点而不导致装箱发生?我知道有,但对于,这是,我希望查看这个值是否为,而不对其进行装箱。此外,我希望以一种既满足值类型又满足引用类型的方式来实现这一点。

  • 封箱包装器 这些对象包装器服务于一个非常重要的目的。基本类型值没有属性或方法,所以为了访问 .length 或 .toString() 你需要这个值的对象包装器。值得庆幸的是,JS 将会自动地 封箱(也就是包装)基本类型值来满足这样的访问。 var a = "abc"; a.length; // 3 a.toUpperCase(); // "ABC" 那么,如果你想以通常的方式访问这些字符串值上的

  • PlayScreen类: 玩家等级: 所以,我正在使用矩形来检测我的碰撞。我已经设置了右矩形和左矩形作为我屏幕的边界线。我想给玩家分配一个精灵和一个矩形。我正在处理PlayScreen类中的碰撞,但它导致了NullPointerException。需要帮助来弄清楚为什么我得到了NullPointerException。 谢谢! 空指针异常:

  • 问题内容: 我正在关注Android图书示例: 该项目可以在Android Studio中运行,但在线上带有黄色警告: 与: 根据我的理解,返回一个Object,然后(Integer)将其转换为int类型,以与满足。 您能告诉我该信息的确切含义吗,对于初学者来说,您的回答将是值得的。 我可以这样写上限吗?使用 () 将getIntent()。getExtras()。get()打包为一个整体,因为它

  • 问题内容: 使用泛型时,我发现了一个奇怪的行为。 在此类中,该成员与以下内容无关: 该类在main中使用: 编译错误为“类型不兼容。必需:找到的字符串:对象”。 似乎Java忘记了使用原始类型时的type参数。 我的Java版本是1.7.0_21 问题答案: 简而言之,由于是原始的,它的非静态成员也变为原始的。 JLS§4.8中对此进行了概述: 更准确地说,原始类型定义为以下之一: 通过采用通用类

  • 我在客户机-服务器模式下使用H2数据库。服务器运行版本为1.3.175,客户端运行版本为1.3.168。 一切似乎都很好,但我在执行一些查询时遇到异常: org.h2.jdbc.jdbcsqlexception:常规错误:“java.lang.nullpointerexception”[50000-175]在org.h2.message.dbexception.getJDBCSqlexceptio