做新闻类网站,linux网站架构,主播网站建立,seo网络营销优化最近的Nicolai Parlog #xff08; nipafx #xff09; 鸣叫引起了我的注意#xff0c;因为它引用了关于JDK 8和JDK 10之间行为更改的有趣StackOverflow讨论 #xff0c;并询问“为什么#xff1f;” SerCe 在StackOverflow线程上引用的问题最终归结为在JDK 8和JDK 10之间… 最近的Nicolai Parlog nipafx 鸣叫引起了我的注意因为它引用了关于JDK 8和JDK 10之间行为更改的有趣StackOverflow讨论 并询问“为什么” 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 HashMapString, 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 doubleValuefalse
? 1.0
: new HashMapString, Double().get(1); null NullPointerException double doubleValue false? 1.0: new HashMapString, Double().get(1); NullPointerException NullPointerException Double doubleValue false? Double.valueOf(1.0): new HashMapString, Double().get(1); null null double doubleValue false? Double.valueOf(1.0): new HashMapString, 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