当我使用三元运算符时抛出 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。
由于您在两个表达式中都有基本的true
和false
,因此您的条件表达式的类型是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 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
MediaRecorder 问题 - 当我尝试写入 sdcard 时抛出 FileNotFoundException
当我运行测试用例时,实体管理器已成功注入,但在运行 Web 应用程序时抛出 NullPointerException
“未处理的异常:NoSuchMethodError:在 null 上调用了 getter 'iterator'。”当我在颤振中使用 google_maps_polyline 插件时抛出