Post

Solving the UnsupportedClassVersionError in Java: Understand, Debug, and Resolve

Welcome to this technical guide where we unravel one of the common errors encountered in your Java environments — the UnsupportedClassVersionError. This article aims to guide you in understanding the error, reproducing it for debugging, and resolving it.

What is UnsupportedClassVersionError?

Java’s UnsupportedClassVersionError is a subclass of the ClassFormatError class and is typically thrown when the Java Virtual Machine (JVM) attempts to read a class file and determines that the version numbers in the class are not supported. This error typically indicates that you are trying to run a class on an older Java version that was fostered on a newer Java version. In this context, it’s crucial to remember that backward compatibility is supported, however, forward compatibility is not.

Let’s see this error in action. Imagine you have compiled a class ExampleClass with Java 11, and now you are trying to run it with Java 8. You will encounter the following error message:

1
Exception in thread "main" java.lang.UnsupportedClassVersionError: ExampleClass has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0

Understanding Java Class File Versions

Java class file versions are directly associated with the Java Development Kit (JDK) versions. For instance, Java 8 corresponds to a class file version of 52, Java 9 corresponds to 53, and so on. Thus, class file version 55 corresponds to Java 11.

This helps us decode the UnsupportedClassVersionError message above, which states the class ExampleClass compiled on Java 11 (class file version 55) cannot be read by lower Java versions that only support class files up to version 52 (Java 8).

How to Reproduce the Error?

For the sake of better understanding, let’s reproduce UnsupportedClassVersionError by performing the following:

  1. Compile a class with a newer JDK version.
  2. Attempt to run the .class file on an older JRE version.

Compile a simple HelloWorld class using JDK 11.

1
2
3
4
5
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

If you try to run the .class file using an older version of Java, like Java 8, you will encounter UnsupportedClassVersionError.

1
2
java HelloWorld
Exception in thread "main" java.lang.UnsupportedClassVersionError: HelloWorld has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0

How to Resolve the UnsupportedClassVersionError?

There are two common ways to get past this error:

1. Upgrade Your Java Runtime Environment:

The most straightforward method to solve the issue is by upgrading your JRE to match the version of the JDK the class was compiled with.

If you’re unsure of the versions, use the following commands:

  • Check the Java compiler (JDK) version:
    1
    
    javac -version
    
  • Check the Java (JRE) version:
    1
    
    java -version
    

2. Compile Your Source Code with an Older JDK Version:

Alternatively, if you cannot upgrade your JRE for any reason, you can compile your Java source code (.java files) with a JDK version compatible with your JRE. In this case, the -target option in javac can be used to specify the target JVM to generate class files.

For example, if you want to target a Java 8 environment, compile your code with the command:

1
javac -target 1.8 HelloWorld.java

This article has provided a solid understanding of UnsupportedClassVersionError in Java, including what it is, how to reproduce it, and the solutions. Remember to keep track of both your runtime and compiler versions while working with different Java applications to minimize the occurrences of version-related errors.

References:

This post is licensed under CC BY 4.0 by the author.