java.lang.UnsupportedClassVersionError
java.lang.UnsupportedClassVersionError是运行时错误之一,当使用比当前Java版本更高的版本来编译类时,抛出该错误。
java.lang.UnsupportedClassVersionError
UnsupportedClassVersionError是一个错误,因此我们无法从应用程序的角度对其进行任何操作以从中恢复。
java.lang.UnsupportedClassVersionError是运行时错误,它不是在编译时出现的。
每个java类都包含major.minor版本号,该数字表示java编译器版本。
每当我们执行一个Java类并且类文件的版本号大于当前的Java版本号时,就会抛出java.lang.UnsupportedClassVersionError
。
Java版本和类Major.Minor版本
下表列出了Java版本和相应的类文件major.minor版本。
Java Version | Class Major.Minor version |
---|---|
1.1 | 45.3 |
1.2 | 46.0 |
1.3 | 47.0 |
1.4 | 48.0 |
5 (1.5) | 49.0 |
6 | 50.0 |
7 | 51.0 |
8 | 52.0 |
9 | 53.0 |
java.lang.UnsupportedClassVersionError示例
我们需要两个Java版本来产生UnsupportedClassVersionError,我在系统中同时安装了Java 8和Java 9,其中Java 8是默认版本。
hyman:temp hyman$java -version java version "1.8.0_131" Java(TM) SE Runtime Environment (build 1.8.0_131-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode) hyman:temp hyman$/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home/bin/java -version java version "9" Java(TM) SE Runtime Environment (build 9+181) Java HotSpot(TM) 64-Bit Server VM (build 9+181, mixed mode) hyman:temp hyman$
我为我们的示例在some目录中创建了一个简单的hello world类,然后使用Java 9对其进行了编译,然后尝试使用Java 8对其进行运行。
hyman:temp hyman$/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home/bin/javac HelloWorld.java hyman:temp hyman$java HelloWorld Error: A JNI error has occurred, please check your installation and try again Exception in thread "main" java.lang.UnsupportedClassVersionError: HelloWorld has been compiled by a more recent version of the Java Runtime (class file version 53.0), this version of the Java Runtime only recognizes class file versions up to 52.0 at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:763) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at java.net.URLClassLoader.defineClass(URLClassLoader.java:467) at java.net.URLClassLoader.access0(URLClassLoader.java:73) at java.net.URLClassLoader.run(URLClassLoader.java:368) at java.net.URLClassLoader.run(URLClassLoader.java:362) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:361) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:495) hyman:temp hyman$
因此,我们能够重现UnsupportedClassVersionError,堆栈跟踪清楚地显示了与Java 9对应的"类文件版本53.0",而当前的Java支持与Java 8对应的版本52.0。
如何修复java.lang.UnsupportedClassVersionError
如果您有权访问Java源文件,则可以再次重新编译该类并以相同版本运行它。
因此,我可以再次编译HelloWorld类或者使用Java 9运行它,两者都可以正常工作。如果您无权访问第三方jar文件等源文件怎么办?在这种情况下,我们将必须将Java版本升级到能够支持它的版本。
由于堆栈跟踪明确指定了类文件的版本号,因此我们知道要安装哪个Java版本来执行程序。