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)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java不可编辑的文本框_如何使编辑文本
- 下一篇: java什么是服务治理平台_Java |