根据原始值检查空包装器

发布于 2025-01-03 01:37:42 字数 317 浏览 1 评论 0原文

Integer i = null;
if (i == 3)

为什么上面的第二行抛出一个 NullPointerException ,恕我直言,这只有一个含义,即包装对象 i 将被拆箱,这会产生异常,例如:

ArrayList<Integer> list = new ArrayList<Integer>();
list.add(null);
int x = list.get(0);

编辑:你可以吗向我提供某种格式的文档吗?

Integer i = null;
if (i == 3)

Why the second line above throws a NullPointerException, IMHO, this has only one meaning which is Wrapper Object i is to be unboxed which yields the Exception such as:

ArrayList<Integer> list = new ArrayList<Integer>();
list.add(null);
int x = list.get(0);

EDIT: Can you supply me with some format doc?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

蓝咒 2025-01-10 01:37:42

它会抛出 NPE,因为编译器会为您执行以下“魔法”:

Integer i = null;
if (i.intValue() == 3)

显然,当 inull 时,i.intValue() 会抛出 NPE。

It throws NPE because compiler does the following "magic" for you:

Integer i = null;
if (i.intValue() == 3)

Obviously i.intValue() throws NPE when i is null.

烟火散人牵绊 2025-01-10 01:37:42

当您尝试将包装数字与原始数字进行比较时,包装器会自动拆箱。如果此时包装器为 null,您将得到 NullPointerException。这是自动装箱系统的常见陷阱之一(另一个是如果在循环中对数字进行装箱/拆箱,性能会很差)

When you try to compare a wrapped number with a primitive one, the wrapper is automatically un-boxed. If at that moment, the wrapper is null, you get a NullPointerException. This is one of the common pitfalls of the autoboxing system (the other being poor performance if you box/unbox numbers in a loop)

最美的太阳 2025-01-10 01:37:42

将包装类视为持有者对象。类似于:

public class Integer {

private int intValue;

//getters and setters

}

如果指针或对整个对象的引用为 null,则无法获取该值来执行任何装箱/拆箱操作。

当您说:

if (i == 3)

拆箱自动发生在null引用上,因此出现异常。

Think of the wrapper class to be a holder object. Something like:

public class Integer {

private int intValue;

//getters and setters

}

If the pointer or the reference to the whole object is null, you cant get to the value to do any boxing/unboxing operations.

When you say:

if (i == 3)

The unboxing occurs automatically on a null reference, hence the exception.

虫児飞 2025-01-10 01:37:42

如果它没有对 Integer 进行拆箱,您会得到奇怪的行为,例如

Integer i1 = -129;
Integer i2 = -129;
if (i1 != i2)
    System.out.println(i1 +" != " + i2);

Integer i1 = -129;
if (i1 != new Integer(-129))
    System.out.println(i1 +" != " + -129);

This prints

-129 != -129

因为引用而不是不同。

If it didn't unbox the Integer you would get strange behaviour like

Integer i1 = -129;
Integer i2 = -129;
if (i1 != i2)
    System.out.println(i1 +" != " + i2);

or

Integer i1 = -129;
if (i1 != new Integer(-129))
    System.out.println(i1 +" != " + -129);

This prints

-129 != -129

because the references rather than the values are different.

转身泪倾城 2025-01-10 01:37:42

这可以避免在比较之前检查 value 是否为 null。

if (dto.getMethod() != null && dto.getMethod() == 0) // Safe check no NPE

以下页面提供了一个很好的包装器,以避免 NPE

http://www.javawiki.org/wiki/Avoid_NullPointerException_on_Primitive_Wrapper_Objects< /a>

This can be avoided checking whether value is null before comparing it.

if (dto.getMethod() != null && dto.getMethod() == 0) // Safe check no NPE

Following page provides a nice wrapper to avoid to NPE

http://www.javawiki.org/wiki/Avoid_NullPointerException_on_Primitive_Wrapper_Objects

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文