java.lang.UnsupportedClassVersionError

时间:2020-02-23 14:36:31  来源:igfitidea点击:

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 VersionClass Major.Minor version
1.145.3
1.246.0
1.347.0
1.448.0
5 (1.5)49.0
650.0
751.0
852.0
953.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版本来执行程序。