【问题标题】:Passing Boolean to method that expects boolean [closed]将布尔值传递给需要布尔值的方法[关闭]
【发布时间】:2021-06-08 03:19:36
【问题描述】:

我将Boolean 值传递给具有boolean 参数的方法。

当我的值为null 时会发生什么?它会为方法中的参数分配一个默认值,例如false,还是会导致任何问题?

【问题讨论】:

  • 你试过了吗?
  • 不,你会得到一个 NullPointerException。所以,不要。
  • @Stultuske 是的,我做到了,每当我们检查它时它工作正常,但对于某些人来说它崩溃了。所以只是想确认这是否是问题所在。
  • 你可以这样称呼它为 null safeyourMethod(Boolean.TRUE.equals(yourBoolean))
  • Java 通过调用 yourBoolean.booleanValue() 自动取消装箱该值,该语句因 NPE 而崩溃。

标签: java boolean wrapper unboxing


【解决方案1】:

拆箱

当您调用一个需要boolean 但给它一个Boolean 的方法时,Java 必须unbox 该值。这会自动且隐含地发生。

因此,在编译期间,Java 会替换您的调用

foo(value);

通过

foo(value.booleanValue());

这个过程在JLS, chapter 5.1.8. Unboxing Conversion中有详细解释:

在运行时,拆箱转换过程如下:

  • 如果rBoolean 类型的引用,则拆箱转换会将r 转换为r.booleanValue()

拆箱null

现在,当valuenull 时,此语句显然会在运行时导致NullPointerException,因为您试图在不引用任何实例的变量上调用方法(booleanValue)。

所以你的代码崩溃了,它不会使用任何默认值作为后备。 Java 在设计时考虑了 fail-fast


改为获取false

如果您希望该方法接收 false 作为后备值,您必须自己明确编码。例如:

foo(value == null ? false : value);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-24
    • 2015-09-08
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    • 2021-10-29
    相关资源
    最近更新 更多