Cannot execute Java program: UnsupportedClassVersionError

I have installed JDK 6, but I can't execute a Java program.

For example, I have made test.java. I compile it with javac tes.java and there's no error when I compile it, but when I want to execute that program it always displays an error. I execute the Java program with 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.

My javac version is 1.7.0, my java version is 1.6.0.

Here is my tes.java code:

class tes{

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

}

Solution 1:

It looks like you've compiled the Java source with a newer version of Java (7) which cannot be executed by the older Java runtime (6). If you don't need/want Java 7, uninstall the openjdk-7-jdk package and install openjdk-6-jdk instead:

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

The alternative is using the direct paths to the specific versions of the compiler or runtime:

Running the Java 7 runtime

It's possible that Java 6 is still the default (compatibility with older programs?). To force the use of the Java 7 runtime, use the direct path to it:

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

(replace amd64 by i386 for the 32-bit version of Java)

Running the Java compiler version 6

If you want to have code compiled for Java version 6, use the full path to the Java 6 compiler:

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

Alternatives

Like I've said before, if you don't like version 7 or 6, uninstall it (openjdk-7-jdk and openjdk-7-jre for version 7, openjdk-6-jdk and openjdk-6-jre for version 6). It's possible to have both versions installed. Use the alternatives system to configure the default one. Run the below commands to configure the runtime and compiler. It'll provide you a choice for the default.

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

Solution 2:

Please take a look at this Java.net thread http://www.java.net/node/664117

In summary this happens when you are compiling your code with one version of JDK but then trying to run the compiled code on an older version of JDK. So for example if you compile your code with JDK6 but try to run it with JDK5, you will get this error.

If you are compiling and running test.java on the same PC then please compare the outputs of the following commands. I believe they will give separate version numbers.

javac -version
java -version

If you are compiling on one PC and then running on another, then compare the output of the first command from the PC where you compile to the output of second command from the PC where you run the program.

It would also help if you add this version info to your question.

Solution 3:

Every generated class file have a major and minor version in it. Because the particular jvm support a range that comes within major and minor version. So your compiled class file have the higher version then your jvm support. Now you have two choice you can use "1.6 java compiler" or "1.7 java".

Solution 4:

Having tried all the above, If it still doesn't work. Try executing the file the below commands:

javac tes.java
java -cp "." tes

This kind of errors are observed when the CLASSPATH variable is not set. Even I had the same problem. Couldn't just execute it. With the above commands it did work.

For further information about CLASSPATH.