jdk10与jdk9的区别

最近的Nicolai Parlog ( @nipafx ) 鸣叫引起了我的注意,因为它引用了一个有趣的StackOverflow讨论 ,该讨论涉及JDK 8和JDK 10之间的行为更改,并询问“为什么?” SerCe 在StackOverflow线程上引用的问题最终归结为在JDK 8和JDK 10之间更改了实现,以正确实现 Java语言规范。

下面的代码清单(略有改编)改编自SerCe在StackOverflow线程上提供的原始示例。

在JDK 10和JDK 8中表现不同的改编示例

public static void demoSerCeExample()
{try{final Double doubleValue = false ? 1.0 : new HashMap<String, Double>().get("1");out.println("Double Value: " + doubleValue);}catch (Exception exception){out.println("ERROR in 'demoSerCeExample': " + exception);}
}

使用JDK 8编译并执行上述代码后,它将生成如下输出:
Double Value: null
使用JDK 10编译并执行上述代码后,它将生成如下输出: ERROR in 'demoSerCeExample': java.lang.NullPointerException 在JDK 8中,三元运算符返回null以分配给局部变量doubleValue ,但在JDK 10中,为同一三元语句抛出NullPointerException

此示例的两个调整导致一些有趣的观察。 首先,如果将三元运算符中表示的文字常量1.0指定为Double.valueOf(1.0) ,则JDK 8和JDK 10都将局部变量设置为null而不是抛出NullPointerException 。 其次,如果使用基本类型double而不是引用类型Double声明了局部变量,则无论Java版本和是否使用Double.valueOf(double)都始终抛出NullPointerException 。 当然,第二个观察是有道理的,因为无论三元运算符如何处理对象或引用,都必须在某个点将其取消引用以分配给原始double类型,并且在示例中始终会导致NullPointerException

下表总结了这些观察结果:

完整的三元声明 设置局部变量doubleValue
JDK 8 JDK 10
Double doubleValue
= false
? 1.0
: new HashMap<String, Double>().get("1");
null NullPointerException
double doubleValue=  false? 1.0: new HashMap<String, Double>().get("1");
NullPointerException NullPointerException
Double doubleValue=  false? Double.valueOf(1.0): new HashMap<String, Double>().get("1");
null null
double doubleValue=  false? Double.valueOf(1.0): new HashMap<String, Double>().get("1");
NullPointerException NullPointerException

对于这个一般的三进制示例,在两个Java版本中都避免NullPointerException的唯一方法是将局部变量声明为引用类型Double (无需取消装箱)并使用Double.valueOf(double)以便在整个引用过程中使用Double三元而非原始的double 。 如果仅通过指定1.0隐式表示原始double ,则Java Map返回的Double在JDK 10中将被隐式取消装箱(取消引用),从而导致异常。 根据Brian Goetz的说法 ,JDK 10使实现返回到符合规范的状态。

翻译自: https://www.javacodegeeks.com/2018/06/jdk-ternary-difference.html

jdk10与jdk9的区别

jdk10与jdk9的区别_JDK 8与JDK 10:三元/拆箱的区别相关推荐

  1. JDK 8与JDK 10:三元/拆箱的区别

    最近的Nicolai Parlog ( @nipafx ) 鸣叫引起了我的注意,因为它引用了关于JDK 8和JDK 10之间行为更改的有趣StackOverflow讨论 ,并询问"为什么?& ...

  2. jdk8 接口抽象类区别_JDK 8时代的抽象类与接口

    jdk8 接口抽象类区别 在新的Java 8日期和时间API:Stephen Colebourne的访谈中 , Stephen Colebourne告诉Hartmut Schlosser :" ...

  3. jdk和jre和jvm区别_JDK,JRE和JVM之间的区别

    jdk和jre和jvm区别 The difference between JDK and JRE and JVM is one of the popular interview questions. ...

  4. java char的包装对象,Java 从Character和char的区别来学习自动拆箱装箱

    本文结构 1.Character和char 的区别: 2.自动拆箱装箱java 1.Character和char 的区别: Character是类,char基本数据类型.数组 在java中有三个类负责 ...

  5. Jdk 和 jre 的 关系和区别

    Jdk 和 jre 的 关系和区别 区别: JDK:是Java Development Kit 的简称–>翻译过来就是:Java 开发工具包.是程序员使用java语言编写java程序所需的开发工 ...

  6. (10)FPGA与ASIC区别

    (10)FPGA与ASIC区别 1 文章目录 1)文章目录 2)FPGA入门与提升课程介绍 3)FPGA简介 4)FPGA与ASIC区别 5)技术交流 6)参考资料 2 FPGA入门与提升课程介绍 1 ...

  7. jdk,jre,jvm的区别以及联系

    作为一个 java开发工程师,我做面试题的时候,竟然都答错了jdk,jre,jvm的区别和联系了,真实太菜了.不过吃一堑长一智,多多吸取教训还是比较好的. JVM:java虚拟机,用来编译和运行jav ...

  8. 天津大学学硕和专硕的区别_21考研考生,学硕与专硕的区别你必须知道,选错或后悔读研...

    对于21考研考生经常会听说学硕(学术学位硕士)和专硕(专业学位硕士),但是两者的区别你真的知道吗?只有真正了解两者区别,才能做出最佳判断,选错甚至会后悔读研. 虽然现在大多数高校专硕改为三年,但是两者 ...

  9. 反射、装箱拆箱、ArrayList与Array的区别 - 天生舞男 - 博客园

    反射.装箱拆箱.ArrayList与Array的区别 Posted on 2005-09-11 23:11 天生舞男 阅读(125) 评论(0) 编辑 收藏 引用 网摘 所属分类: SPS 1 什么是 ...

最新文章

  1. Create C++ Windows Forms Application in Visual Studio 2017
  2. python_ re模块学习
  3. 深入理解JavaScript定时函数setTimeout
  4. 数学之美 系列九 -- 如何确定网页和查询的相关性
  5. java文件下载并添加水印_Java下载文件加文字水印(Excel、PDF、图片)
  6. php框架 路由_PHP框架开发之Route路由简单实现
  7. 支持MYSQL的DNS服务器的搭建
  8. Unity--使用反编译软件ILSpy查看dll中的代码
  9. Java实现 蓝桥杯VIP 算法训练 会议中心
  10. VC2012 ActiveX 控制台打印调试
  11. [ESP32/ESP8266专题笔记-5] ESP8266开发板-Micropython-串口控制继电器
  12. k8s 亲和 反亲和介绍
  13. BI神器Power Query(19)-- PQ提取商品信息
  14. 计组-堆栈寻址-堆栈指针
  15. 中软国际万人基地项目落户高新区软件新城(组图)
  16. TCL爱奇艺再次联姻 共同打造国际微电影节
  17. 第七届蓝桥杯——生日蜡烛
  18. extjs 修改官方主题
  19. Blink内存分配器PartitionAlloc
  20. [python] 开发小游戏 豆豆吃花瓣

热门文章

  1. 牛客网【每日一题】5月19日题目精讲 比赛
  2. 牛客网【每日一题】4月13号 Accumulation Degree
  3. 不止代码:路径数量(ybtoj-最小生成树)
  4. bzoj#4722-由乃【倍增,抽屉原理,bitset】
  5. CF1419E-Decryption【数论,dfs】
  6. P1447-[NOI2010]能量采集【GCD,数论,容斥】
  7. 【dfs】拔河比赛(ybtoj dfs-1-1)
  8. 图论复习——最小生成树MST
  9. Sentinel(二十)之Envoy RLS Token Server
  10. web.xml 组件加载顺序