【问题标题】:NullPointerException throws when I use ternary operator [duplicate]当我使用三元运算符时抛出 NullPointerException [重复]
【发布时间】:2015-07-16 17:20:26
【问题描述】:

我有以下返回语句:

public Boolean foo(String booleanString){  
    return ("true".equals(booleanString) ? true : ("false".equals(booleanString) ? false : null));
}

booleanString 不等于true 而不是false 时,我得到NullPointerException

是装箱/拆箱问题吗?

【问题讨论】:

  • booleanString 中有什么值
  • 是的。我猜它正在尝试将null 转换为布尔值。你能发布方法签名吗?

标签: java boolean ternary-operator boxing unboxing


【解决方案1】:

你猜对了。正式解释,答案在JLS

如果第二个和第三个操作数之一是原始类型 T,并且 另一个的类型是应用拳击转换的结果 (§5.1.7) 到 T,则条件表达式的类型为 T。

由于您在两个表达式中都有基本的truefalse,因此您的条件表达式的类型是boolean

当你进入第二个表达式时,在第二种情况下,空引用被转换为布尔值null.booleanValue();,导致NPE,所以表达式相当于:

return Boolean.valueOf(null.booleanValue());

(然后表达式的返回类型被重新装箱为Boolean,但你猜到了为时已晚。

例如:

return ("true".equals(booleanString) ? Boolean.TRUE : ("false".equals(booleanString) ? Boolean.FALSE : null));

不会导致 NPE,因为表达式的类型是 Boolean。然而,

return ("true".equals(booleanString) ? true : ("false".equals(booleanString) ? Boolean.FALSE : null));

导致它,因为同样的规则再次适用(因为第一个表达式是原始 boolean 类型)。所以相当于:

return Boolean.valueOf(("true".equals(booleanString) ? true : ("false".equals(booleanString) ? Boolean.FALSE : null).booleanValue());

【讨论】:

    【解决方案2】:

    当您返回对象类型 Boolean 时,java 会尝试将返回值 null 拆箱为逻辑表达式中的 boolean 原始类型,其中 foo() 一直在使用。你会得到空指针异常。

    这是一个类似的案例和我的解释:https://stackoverflow.com/a/30055584/784540

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-04
      • 2013-07-20
      • 2019-11-12
      • 1970-01-01
      • 2023-03-24
      • 2023-03-12
      • 2023-02-03
      • 2012-02-02
      相关资源
      最近更新 更多