jdk10与jdk9的区别_JDK 8与JDK 10:三元/拆箱的区别
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 | |
|
null
|
NullPointerException
|
|
NullPointerException
|
NullPointerException
|
|
null
|
null
|
|
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:三元/拆箱的区别相关推荐
- JDK 8与JDK 10:三元/拆箱的区别
最近的Nicolai Parlog ( @nipafx ) 鸣叫引起了我的注意,因为它引用了关于JDK 8和JDK 10之间行为更改的有趣StackOverflow讨论 ,并询问"为什么?& ...
- jdk8 接口抽象类区别_JDK 8时代的抽象类与接口
jdk8 接口抽象类区别 在新的Java 8日期和时间API:Stephen Colebourne的访谈中 , Stephen Colebourne告诉Hartmut Schlosser :" ...
- jdk和jre和jvm区别_JDK,JRE和JVM之间的区别
jdk和jre和jvm区别 The difference between JDK and JRE and JVM is one of the popular interview questions. ...
- java char的包装对象,Java 从Character和char的区别来学习自动拆箱装箱
本文结构 1.Character和char 的区别: 2.自动拆箱装箱java 1.Character和char 的区别: Character是类,char基本数据类型.数组 在java中有三个类负责 ...
- Jdk 和 jre 的 关系和区别
Jdk 和 jre 的 关系和区别 区别: JDK:是Java Development Kit 的简称–>翻译过来就是:Java 开发工具包.是程序员使用java语言编写java程序所需的开发工 ...
- (10)FPGA与ASIC区别
(10)FPGA与ASIC区别 1 文章目录 1)文章目录 2)FPGA入门与提升课程介绍 3)FPGA简介 4)FPGA与ASIC区别 5)技术交流 6)参考资料 2 FPGA入门与提升课程介绍 1 ...
- jdk,jre,jvm的区别以及联系
作为一个 java开发工程师,我做面试题的时候,竟然都答错了jdk,jre,jvm的区别和联系了,真实太菜了.不过吃一堑长一智,多多吸取教训还是比较好的. JVM:java虚拟机,用来编译和运行jav ...
- 天津大学学硕和专硕的区别_21考研考生,学硕与专硕的区别你必须知道,选错或后悔读研...
对于21考研考生经常会听说学硕(学术学位硕士)和专硕(专业学位硕士),但是两者的区别你真的知道吗?只有真正了解两者区别,才能做出最佳判断,选错甚至会后悔读研. 虽然现在大多数高校专硕改为三年,但是两者 ...
- 反射、装箱拆箱、ArrayList与Array的区别 - 天生舞男 - 博客园
反射.装箱拆箱.ArrayList与Array的区别 Posted on 2005-09-11 23:11 天生舞男 阅读(125) 评论(0) 编辑 收藏 引用 网摘 所属分类: SPS 1 什么是 ...
最新文章
- Create C++ Windows Forms Application in Visual Studio 2017
- python_ re模块学习
- 深入理解JavaScript定时函数setTimeout
- 数学之美 系列九 -- 如何确定网页和查询的相关性
- java文件下载并添加水印_Java下载文件加文字水印(Excel、PDF、图片)
- php框架 路由_PHP框架开发之Route路由简单实现
- 支持MYSQL的DNS服务器的搭建
- Unity--使用反编译软件ILSpy查看dll中的代码
- Java实现 蓝桥杯VIP 算法训练 会议中心
- VC2012 ActiveX 控制台打印调试
- [ESP32/ESP8266专题笔记-5] ESP8266开发板-Micropython-串口控制继电器
- k8s 亲和 反亲和介绍
- BI神器Power Query(19)-- PQ提取商品信息
- 计组-堆栈寻址-堆栈指针
- 中软国际万人基地项目落户高新区软件新城(组图)
- TCL爱奇艺再次联姻 共同打造国际微电影节
- 第七届蓝桥杯——生日蜡烛
- extjs 修改官方主题
- Blink内存分配器PartitionAlloc
- [python] 开发小游戏 豆豆吃花瓣
热门文章
- 牛客网【每日一题】5月19日题目精讲 比赛
- 牛客网【每日一题】4月13号 Accumulation Degree
- 不止代码:路径数量(ybtoj-最小生成树)
- bzoj#4722-由乃【倍增,抽屉原理,bitset】
- CF1419E-Decryption【数论,dfs】
- P1447-[NOI2010]能量采集【GCD,数论,容斥】
- 【dfs】拔河比赛(ybtoj dfs-1-1)
- 图论复习——最小生成树MST
- Sentinel(二十)之Envoy RLS Token Server
- web.xml 组件加载顺序