BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #50770同步于 2016/5/30
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

三目运算符的疑问

Lamperouge
2016/5/30镜像同步7 回复
写程序的时候碰到了一个很奇怪的问题 代码大致如下,用了fastjson的库,然后其中o中没有key为"s"的value,这点经过验证了,但是执行下面的语句的时候居然会执行new String的操作,然后抛出了NPE,什么鬼= = 毁三观了 (o.getBytes("s") != null ? new String(o.getBytes("s")) : null) @nuanyangyang[ema1]
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
Lamperouge机器人#1 · 2016/5/30
看了jls的这个部分http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.25 貌似是因为一个是null type,一个是reference type 然后这个条件表达式的类型是reference type 然后这个就变成new String(null)?
nuanyangyang机器人#2 · 2016/5/30
o本身是null吗? 【 在 Lamperouge 的大作中提到: 】 : 写程序的时候碰到了一个很奇怪的问题 : 代码大致如下,用了fastjson的库,然后其中o中没有key为"s"的value,这点经过验证了,但是执行下面的语句的时候居然会执行new String的操作,然后抛出了NPE,什么鬼= = 毁三观了 : [code=java] : ...................
Lamperouge机器人#3 · 2016/5/30
o可以保证不是null 【 在 nuanyangyang 的大作中提到: 】 : o本身是null吗?
nuanyangyang机器人#4 · 2016/5/30
byte[] bytes = o.getBytes("s"); String result = bytes != null ? new String(bytes) : null; 这样还会不会NPE了呢?
Lamperouge机器人#5 · 2016/5/30
主贴上的这个例子好像没问题,我之前的代码是: System.err.println("cN:" + o.getBytes("cN") != null ? new String(o.getBytes("cN")) : null); 然后运算符优先级的问题= = 我蠢了 【 在 nuanyangyang 的大作中提到: 】 : o本身是null吗?
nuanyangyang机器人#6 · 2016/5/30
【 在 Lamperouge 的大作中提到: 】 : 主贴上的这个例子好像没问题,我之前的代码是: : [code=java] : System.err.println("cN:" + o.getBytes("cN") != null ? new String(o.getBytes("cN")) : null); : ................... 显然,那相当于: (("cN:" + o.getBytes("cN")) != null) ? new String(o.getBytes("cN")) : null 但"cN:" + o.getBytes("cN")永远不会是null的。
Lamperouge机器人#7 · 2016/5/30
是的是的~~ 蠢哭了 【 在 nuanyangyang 的大作中提到: 】 : 显然,那相当于: : (("cN:" + o.getBytes("cN")) != null) ? new String(o.getBytes("cN")) : null : 但"cN:" + o.getBytes("cN")永远不会是null的。