UnsupportedClassVersionError is thrown when the Java Virtual Machine attempts to read a class file and determines that the major and minor version numbers in the file are not supported.
This error occur, when you compile the Java class file in higher version (For Ex: java1.8) and try to run on lower version (Ex: Java 1.7)
Let’s experiment the same.
HelloWorld.java
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
Let’s compile HelloWorld.java class using Jdk1.8.
$/Library/Java/JavaVirtualMachines/jdk1.8.0_311.jdk/Contents/Home/bin/javac -version
javac 1.8.0_311
$
$/Library/Java/JavaVirtualMachines/jdk1.8.0_311.jdk/Contents/Home/bin/javac HelloWorld.java
Let’s run HelloWorld.class file using Jdk1.7.
$/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/bin/java -version
java version "1.7.0_80"
Java(TM) SE Runtime Environment (build 1.7.0_80-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.80-b11, mixed mode)
$
$
$/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/bin/java HelloWorld
Exception in thread "main" java.lang.UnsupportedClassVersionError: HelloWorld : Unsupported major.minor version 52.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:482)
Oops, I got the error ‘java.lang.UnsupportedClassVersionError: HelloWorld : Unsupported major.minor version 52.0’.
Below table summarizes different major.minor versions of Jdk.
JDK version |
Major version number |
JDK 1.1 |
45 |
JDK 1.2 |
46 |
JDK 1.3 |
47 |
JDK 1.4 |
48 |
Java SE 5.0 |
49 |
Java SE 6.0 |
50 |
Java SE 7 |
51 |
Java SE 8 |
52 |
Java SE 9 |
53 |
Java SE 10 |
54 |
Java SE 11 |
55 |
Java SE 12 |
56 |
Java SE 13 |
57 |
Java SE 14 |
58 |
Java SE 15 |
59 |
Java SE 16 |
60 |
Java SE 17 |
61 |
From the error message, you can see the number 52, that means this class is compiled with Java SE 8 and not compatible with the current running environment.
How to resolve this error?
Solution 1: Upgrade Java runtime environment to the compiled version. In our example, we need to upgrade Java run time environment to 1.8.
Solution 2: Specify the target and source versions while compiling the class file.
Ex
javac -target 1.7 -source 1.7 HelloWorld.java
$/Library/Java/JavaVirtualMachines/jdk1.8.0_311.jdk/Contents/Home/bin/javac -target 1.7 -source 1.7 HelloWorld.java
warning: [options] bootstrap class path not set in conjunction with -source 1.7
1 warning
$
$
$/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/bin/java HelloWorld
Hello World
References
https://en.wikipedia.org/wiki/Java_class_file
You may like
Get the length of longest row in a two dimensional jagged array in Java
Quick guide to OutOfMemoryError in Java
StackOverFlowError vs OutOfMemoryError in Java
No comments:
Post a Comment