日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Java高版本编译低版本运行_Java高版本编译低版本运行错误(ConcurrentHashMap.keySet)...

發布時間:2025/3/21 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java高版本编译低版本运行_Java高版本编译低版本运行错误(ConcurrentHashMap.keySet)... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

發布于: 2018-06-19 11:13:37

問題

有個程序,在有些機器會出現清空數據失敗的問題,不拋出任何錯誤,本機無法重現。

定位問題

由于不拋出任何錯誤,只能增加日志, 最終定位到調用ConcurrentHashMap.keySet()方法卡死

對比出現問題的機器與沒有問題的機器,發現出問題的機器JDK版本是1.7, 而沒有問題的JDK版本是1.8

基本可以確定是由于keySet() 方法與JDK 版本不一致導致的問題

但是我本機pom.xml中已經指定language level 為1.7:

org.apache.maven.plugins

maven-compiler-plugin

3.1

1.7

1.7

按理應該不會出現版本不一問題

然后網上看到這篇文章

得到結論與解決方法

在javac指定了這些參數,降低版本號來編譯,會導致生成class文件被標識為較低版本以供指定的JVM加載。但是,基于JDK 8的bootstrap class編譯而成的keySet()方法,其返回值依舊是JDK 8中ConcurrentHashMap$KeySetView這個新增內部類。運行時,1.7的JVM嘗試加載這個class文件,一定找不到KeySetView作為返回值的keySet()方法,出錯。

解決方式

使用父類/接口替換子類,即ConcurrentMap替換ConcurrentHashMap聲明

即使用ConcurrentMap map = new ConcurrentHashMap()替換 ConcurrentHashMap map = new ConcurrentHashMap()

結論

保證編譯、打包環境和最終部署環境JDK版本的一致性

如果無法保證,就盡量面向接口編程,尤其是JDK中提供的類。原因是接口不易改變,而實現類遵循“寬收嚴發”原則,方法的入參和出參都是易變的。

總結

以上是生活随笔為你收集整理的Java高版本编译低版本运行_Java高版本编译低版本运行错误(ConcurrentHashMap.keySet)...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。