日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

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

發布時間:2025/3/21 java 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)...的全部內容,希望文章能夠幫你解決所遇到的問題。

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