美文网首页
关于三目表达式问题

关于三目表达式问题

作者: sushengren | 来源:发表于2017-08-22 14:02 被阅读0次

记录一个使用三目表达式时遇到的问题:问题是由三目表达式与自动拆箱同时使用造成的(显然自动拆箱并不是我自己主动调用的)

首先来看出问题的代码:

Map<String, Integer> map = new HashMap<String, Integer>();
Integer i = (map != null ? map.get("test") : 0);

该段代码运行结果为空指针,既然报空指针说明是有null对象调用了某个方法,这段代码中也就map.get("test")这一处调用,map已经事先初始化过了所以不会是null。于是我将该class文件进行了反编译:

Map map = new HashMap();
Integer i = Integer.valueOf((map != null) ? ((Integer) map.get("test")).intValue() : 0);

可以看到, ((Integer) map.get("test")).intValue()这里的 map.get("test")的返回值是null,之后强转为Integer还是null,所以null调用intValue()导致了空指针异常。

这里就要注意三目运算符的语法规范了,简单的来说就是:当第二,第三位操作数分别为对象和基本类型时,其中的对象就会拆箱为基本类型。

所以,结果就是:由于使用了三目运算符,并且第二、第三位操作数分别是对象和基本类型。所以对对象进行拆箱操作,由于该对象为null,所以在拆箱过程中调用null.intValue()的时候就报了空指针。 所以正确的写法应该是:

Map<String, Integer> map = new HashMap<String, Integer>();
Integer i = (map != null ? map.get("test") : Integer.valueOf(0));

反编译的结果为:

Map map = new HashMap();
Integer i = (map != null) ? (Integer) map.get("test") : Integer.valueOf(0);

可以看到,当第二,第三位操作数都是对象时就不会进行拆箱操作,也就不会出现上述问题。

相关文章

  • 关于三目表达式问题

    记录一个使用三目表达式时遇到的问题:问题是由三目表达式与自动拆箱同时使用造成的(显然自动拆箱并不是我自己主动调用的...

  • js中的真谛

    三目 三目运算表达式: 表达式 ? 表达式1 : 表达式2 if-else-if 真谛:每一个else都是对它上面...

  • Java 三目运算 if else 一行代码搞定

    java 三目运算符 Java中三目运算符的语法: 表达式1?表达式2:表达式3;运算顺序先计算‘表达式1’的值 ...

  • OC小技巧

    一、OC更简便的使用三目运算符 我们都知道OC中三目运算符的基本格式 : (关系表达式) ? 表达式1 : 表达式...

  • JavaScript(5.11)③

    1.三目运算符(三元运算符) += -= *= /= %= 表达式1?:表达式2:表达式3; 表达式1的值应该...

  • js笔记之运算符

    一:运算符和表达式 1.三目运算符(三元运算符) 表达式1?:表达式2:表达式3; ...

  • iOS小知识点罗列

    三目运算符## 基本格式 : (关系表达式) ? 表达式1:表达式2执行流程 :关系表达式为真 返回表达式...

  • 2018-05-25笔记

    一:运算符和表达式 1.三目运算符(三元运算符) 表达式1?:表达式2:表达式3...

  • 三目运算符,函数,声明提前

    一:运算符和表达式 1.三目运算符(三元运算符) += -= *= /= %= 表达式1?:表达式2:表达式3...

  • Object-C 三目运算符

    一、三目运算符 1、基本格式 : (关系表达式) ? 表达式1 : 表达式2; 执行流程 : 关系表达式为 真 返...

网友评论

      本文标题:关于三目表达式问题

      本文链接:https://www.haomeiwen.com/subject/idgkdxtx.html