jdk10与jdk9的区别_JDK 8与JDK 10:三元/拆箱的区别
jdk10與jdk9的區(qū)別
最近的Nicolai Parlog ( @nipafx ) 鳴叫引起了我的注意,因?yàn)樗昧艘粋€(gè)有趣的StackOverflow討論 ,該討論涉及JDK 8和JDK 10之間的行為更改,并詢問(wèn)“為什么?” SerCe 在StackOverflow線程上引用的問(wèn)題最終歸結(jié)為在JDK 8和JDK 10之間更改了實(shí)現(xiàn),以正確實(shí)現(xiàn) Java語(yǔ)言規(guī)范。
下面的代碼清單(略有改編)改編自SerCe在StackOverflow線程上提供的原始示例。
在JDK 10和JDK 8中表現(xiàn)不同的改編示例
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編譯并執(zhí)行上述代碼后,它將生成如下輸出:
Double Value: null
使用JDK 10編譯并執(zhí)行上述代碼后,它將生成如下輸出: ERROR in 'demoSerCeExample': java.lang.NullPointerException 在JDK 8中,三元運(yùn)算符返回null以分配給局部變量doubleValue ,但在JDK 10中,為同一三元語(yǔ)句拋出NullPointerException 。
此示例的兩個(gè)調(diào)整導(dǎo)致一些有趣的觀察。 首先,如果將三元運(yùn)算符中表示的文字常量1.0指定為Double.valueOf(1.0) ,則JDK 8和JDK 10都將局部變量設(shè)置為null而不是拋出NullPointerException 。 其次,如果使用基本類型double而不是引用類型Double聲明了局部變量,則無(wú)論Java版本和是否使用Double.valueOf(double)都始終拋出NullPointerException 。 當(dāng)然,第二個(gè)觀察是有道理的,因?yàn)闊o(wú)論三元運(yùn)算符如何處理對(duì)象或引用,都必須在某個(gè)點(diǎn)將其取消引用以分配給原始double類型,并且在示例中始終會(huì)導(dǎo)致NullPointerException 。
下表總結(jié)了這些觀察結(jié)果:
| 完整的三元聲明 | 設(shè)置局部變量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 |
對(duì)于這個(gè)一般的三進(jìn)制示例,在兩個(gè)Java版本中都避免NullPointerException的唯一方法是將局部變量聲明為引用類型Double (無(wú)需取消裝箱)并使用Double.valueOf(double)以便在整個(gè)引用過(guò)程中使用Double三元而非原始的double 。 如果僅通過(guò)指定1.0隱式表示原始double ,則Java Map返回的Double在JDK 10中將被隱式取消裝箱(取消引用),從而導(dǎo)致異常。 根據(jù)Brian Goetz的說(shuō)法 ,JDK 10使實(shí)現(xiàn)返回到符合規(guī)范的狀態(tài)。
翻譯自: https://www.javacodegeeks.com/2018/06/jdk-ternary-difference.html
jdk10與jdk9的區(qū)別
總結(jié)
以上是生活随笔為你收集整理的jdk10与jdk9的区别_JDK 8与JDK 10:三元/拆箱的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 微软发布 PowerToys 0.74:
- 下一篇: 三星 LPCAMM 规格内存细节曝光:与