当我使用三元运算符时抛出 NullPointerException [重复]

Posted

技术标签:

【中文标题】当我使用三元运算符时抛出 NullPointerException [重复]【英文标题】:NullPointerException throws when I use ternary operator [duplicate] 【发布时间】: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 转换为布尔值。你能发布方法签名吗? 【参考方案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://***.com/a/30055584/784540

【讨论】:

以上是关于当我使用三元运算符时抛出 NullPointerException [重复]的主要内容,如果未能解决你的问题,请参考以下文章

JPA CONCATE 与 IN 运算符一起使用时抛出异常

MediaRecorder 问题 - 当我尝试写入 sdcard 时抛出 FileNotFoundException

C ++中的抛出和三元运算符

当我运行测试用例时,实体管理器已成功注入,但在运行 Web 应用程序时抛出 NullPointerException

当我尝试运行此代码时抛出异常..(导入到 sql 数据库)

“未处理的异常:NoSuchMethodError:在 null 上调用了 getter 'iterator'。”当我在颤振中使用 google_maps_polyline 插件时抛出