虽然使用高版本的JDK能够经过指定编译source和target参数来兼容低版本JDK,但只是class文件格式上的,若是引用了高版本JRE库中某些方法同样会再低版本的JDK上报错;典型的例子就是java.util.concurrent.ConcurrentHashMap.keySet()这个方法!java
import java.util.Iterator; import java.util.concurrent.ConcurrentHashMap; public class T { public static void main(String[] args) { ConcurrentHashMap<String, String> map = new ConcurrentHashMap<String, String>(); map.put("hello", ""); Iterator<String> it = map.keySet().iterator(); System.out.println(it.next()); } }
用jdk1.8编译 /jdk1.8/bin/javac -source 1.7 -target 1.7 T.javacode
用jdk1.7执行 /jdk1.7/bin/java Tget
会报异常 java.lang.NoSuchMethodError: java.util.concurrent.ConcurrentHashMap.keySet()Ljava/util/concurrent/ConcurrentHashMap$KeySetViewit
解决的办法是,编译使用对应的JDK,确保JRE的类库是对应版本。不然在乎想不到的地方出现坑!编译