当我们在运行Java程序时,可能会遇到 “UnsupportedClassVersionError” 异常,这意味着我们使用的Java版本与编译Java程序的版本不兼容。即编译出的.class文件的JVM版本高于当前使用的JVM版本所支持的版本。此时,runtime环境将不允许这个class文件在该版本下加载运行。下面分别介绍一下这个错误的原因和解决方法。
原因分析
Java程序运行时候,需要进行编译,编译出的.class文件依据Java SE版本不同而不同。如果使用的Java运行环境(JRE)版本低于编译Java程序时的版本,就会遇到 “UnsupportedClassVersionError” 异常。
比如:在用JRE1.7的环境下,运行JDK1.8编译的class文件,即会发生这个错误。
解决方法
解决办法就是更新Java运行环境,并通过修改编译选项来改变编译出的.class文件对应的JVM版本。
方法一:更新Java运行环境
更新Java运行环境到与编译Java程序时的版本相同,即可避免这个错误。具体操作步骤如下:
- 先查看自己的操作系统中Java版本,使用命令java -version或者javac -version,可以分别查看JRE或者JDK当前的版本。
$ java -version
java version "1.7.0_80"
Java(TM) SE Runtime Environment (build 1.7.0_80-b15)
Java HotSpot(TM) Client VM (build 24.80-b11, mixed mode, sharing)
-
下载与编译Java程序版本相同的Java运行环境,并安装到电脑上。
-
设置Java环境变量。
-
在运行Java程序时,检查JVM版本是否与编译时相同。
方法二:修改编译选项
修改编译选项,使编译出的.class文件的JVM版本与当前Java运行环境所支持的版本相同。
- 在编译Java程序时,使用可选参数 -source 和 -target 来修改编译选项。
source表示源代码的版本,target表示编译出的.class文件所支持的JVM版本。比如,使用下面的命令行来编译Java程序,指定target版本为1.7,则会在JVM版本为1.7及以上的环境下运行该class文件。
$ javac -source 1.7 -target 1.7 MyJavaClass.java
- 将编译出的.class文件放到对应的JVM版本的环境中运行。
这种方法需要我们手动指定具体的JVM版本,因此不太实用。建议优先选择更新Java运行环境这个方法。
例子
例子一:使用过时的Java环境
使用JRE1.7版本运行JDK1.8编译的HelloWorld.class文件,会产生 “UnsupportedClassVersionError” 异常。
$ javac HelloWorld.java
$ java -version
java version "1.7.0_80"
$ java HelloWorld
Exception in thread "main" java.lang.UnsupportedClassVersionError: HelloWorld :
Unsupported major.minor version 52.0
例子二:指定编译选项
使用命令 javac -source 1.7 -target 1.7 MyJavaClass.java 编译Java程序,在JVM版本为1.7及以上的环境下运行该class文件。
$ javac -source 1.7 -target 1.7 MyJavaClass.java
$ java -version
java version "1.7.0_80"
$ java MyJavaClass