开发者社区> 问答> 正文

原理分析以下代码带来的异常问题

原理分析以下代码带来的异常问题

展开
收起
huc_逆天 2021-01-08 14:14:58 461 0
1 条回答
写回答
取消 提交回答
  • 技术架构师 阿里云开发者社区技术专家博主 CSDN签约专栏技术博主 掘金签约技术博主 云安全联盟专家 众多开源代码库Commiter
    Map<String,Boolean> map = new HashMap<String, Boolean>();
    Boolean b = (map!=null ? map.get("test") : false);
    

    查看反编译之后的代码,我们准确的定位到了问题,分析之后我们可以得出 这样的结论:NPE 的原因应该是三目运算符和自动拆箱导致了空指针异常。 根据规定,三目运算符的第二、第三位操作数的返回值类型应该是一样的,这样 才能当把一个三目运算符的结果赋值给一个变量。 如:Person i = a>b : i1:i2; ,就要求i1 和i2 的类型都必须是Person 才行。 因为Java 中存在一种特殊的情况,那就是基本数据类型和包装数据类型可以 通过自动拆装箱的方式互相转换。即可以定义int i = new Integer(10);也可以定义 Integer i= 10; 那如果,三目运算符的第二位和第三位的操作数的类型分别是基本数据类型和包 装类型对象时,就需要有一方需要进行自动拆装箱。 那到底如何做的呢,根据三目运算符的语法规范。参见jls-15.25,摘要如下: If the second and third operands have the same type (which may be the null type), then that is the type of the conditional expression. If one of the second and third operands is of primitive type T, and the type of the other is the result of applying boxing conversion (§5.1.7) to T, then the type of the conditional expression is T. If one of the second and third operands is of the null type and the type of the other is a reference type, then the type of the conditional expression is that reference type. 简单的来说就是:当第二,第三位操作数分别为基本类型和对象时,其中的对象 就会拆箱为基本类型进行操作。 所以,结果就是:由于使用了三目运算符,并且第二、第三位操作数分别是基本 类型和对象。所以对对象进行拆箱操作,由于该对象为null,所以在拆箱过程中调用 null.booleanValue() 的时候就报了NPE。

    2021-01-08 14:15:11
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
如何做小程序性能优化 立即下载
Android应用启动速度和内存优化实践 立即下载
Android应用-启动速度和内存优化实践 立即下载