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

关于三目表达式问题

作者: 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);
    

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

    相关文章

      网友评论

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

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