无法执行 Java 程序:UnsupportedClassVersionError

无法执行 Java 程序:UnsupportedClassVersionError

我已经安装了JDK 6,但是无法执行Java程序。

例如,我创建了 test.java。我用 编译它,javac tes.java编译时没有错误,但是当我想要执行该程序时,它总是显示错误。我用 执行 Java 程序java tes

Exception in thread "main" java.lang.UnsupportedClassVersionError: tes : Unsupported major.minor version 51.0
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:634)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:277)
    at java.net.URLClassLoader.access$000(URLClassLoader.java:73)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:212)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
Could not find the main class: tes. Program will exit.

我的javac版本是1.7.0,我的java版本是1.6.0。

这是我的tes.java代码:

class tes{

    public static void main(String[]args){
        System.out.println("hello");    
    }   

}

答案1

看起来您已使用较新版本的 Java (7) 编译了 Java 源代码,而较旧的 Java 运行时 (6) 无法执行该版本。如果您不需要/不想要 Java 7,请卸载该openjdk-7-jdk软件包并安装openjdk-6-jdk

sudo apt-get remove openjdk-7-jdk
sudo apt-get install openjdk-6-jdk

另一种方法是使用编译器或运行时特定版本的直接路径:

运行 Java 7 运行时

Java 6 可能仍是默认设置(与旧程序兼容?)。要强制使用 Java 7 运行时,请使用它的直接路径:

/usr/lib/jvm/java-7-openjdk-amd64/bin/java tes

(对于 32 位版本的 Java,请将其替换amd64为)i386

运行 Java 编译器版本 6

如果要针对 Java 版本 6 编译代码,请使用 Java 6 编译器的完整路径:

/usr/lib/jvm/java-6-openjdk/bin/javac tes.java

备择方案

就像我之前说过的,如果你不喜欢版本 7 或 6,请卸载它(openjdk-7-jdk对于openjdk-7-jre版本 7openjdk-6-jdkopenjdk-6-jre版本 6)。可以同时安装两个版本。使用替代系统配置默认版本。运行以下命令来配置运行时和编译器。它将为您提供默认选项。

sudo update-alternatives --config java
sudo update-alternatives --config javac

答案2

请查看此 Java.net 线程http://www.java.net/node/664117

总之,当您使用某个版本的 JDK 编译代码,但尝试在旧版本的 JDK 上运行编译后的代码时,就会发生这种情况。例如,如果您使用 JDK6 编译代码,但尝试使用 JDK5 运行它,就会出现此错误。

如果您在同一台电脑上编译并运行 test.java,请比较以下命令的输出。我相信它们会给出不同的版本号。

javac -version
java -version

如果您在一台 PC 上进行编译,然后在另一台 PC 上运行,则请将编译所在的 PC 上的第一个命令的输出与运行程序所在的 PC 上的第二个命令的输出进行比较。

如果您将此版本信息添加到您的问题中也会有所帮助。

答案3

每个生成的类文件都有一个主版本和次版本。因为特定的 jvm 支持主版本和次版本之间的范围。所以您编译的类文件具有比 jvm 支持的版本更高的版本。现在您有两个选择,您可以使用“1.6 java 编译器”或“1.7 java”。

答案4

test.java您写道,您尝试使用编译文件javac tes.java- 这无法独立于您的 JDK 工作,因为*.java文件名必须与其类的名称匹配;并且我认为没有tes.java file。那么,可以javac test.java工作吗?

来自联机帮助页的附加信息javac

“源代码文件名必须带有 .java 后缀,类文件名必须带有 .class 后缀,并且源文件和类文件都必须具有标识类的根名称。例如,名为 MyClass 的类将会写成源文件名为MyClass.java并编译成名为 MyClass.class 的字节码类文件“”。

相关内容