Solucione el error java.lang.UnsupportedClassVersion

Sheeraz Gul 20 junio 2023
  1. Causa del java.lang.UnsupportedClassVersionError
  2. Solucione el java.lang.UnsupportedClassVersionError
Solucione el error java.lang.UnsupportedClassVersion

Este tutorial demuestra el error Exception in thread main java.lang.UnsupportedClassVersionError en Java.

Causa del java.lang.UnsupportedClassVersionError

El UnsupportedClassVersionError es una subclase de la excepción ClassFormatError, que se lanza cuando JVM intenta leer una clase y descubre que el archivo de clase tiene un formato incorrecto o que el archivo no se puede interpretar como una clase. Aquí está la jerarquía de la excepción UnsupportedClassVersionError:

Java.Lang.Object
    Java.Lang.Throwable
        Java.Lang.Error
            Java.Lang.LinkageError
                Java.Lang.ClassFormatError
                    Java.Lang.UnsupportedClassVersionError

La excepción UnsupportedClassVersionError es específica para detectar un archivo de clase ejecutado antes por una versión anterior de Java y ahora ejecutado por una versión más nueva.

Por ejemplo, supongamos que un archivo Java fue ejecutado por JDK 12 y ahora por un JRE 8 más nuevo. En ese caso, lanzará la excepción UnsupportedClassVersionError, o si compilamos la clase usando Java versión 1.8 y compilamos usando Java 1.7, arrojará el mismo error.

Probemos un ejemplo en una clase compilada por la versión más reciente de Java y luego ejecutada por una versión anterior. Ver ejemplo:

public class Unsupported_Class_Version_Error{
    public static void main(String args[]) {
        System.out.println("Hello this is Delftstack.com");
    }
}

El código anterior arrojará el UnsupportedClassVersionError como se muestra a continuación:

Exception in thread "main" java.lang.UnsupportedClassVersionError: Unsupported_Class_Version_Error : 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)

El resultado muestra el error porque el código se compila en Java 1.8 y se ejecuta en Java 1.7. Es por eso que se lanzará Exception in thread "main" java.lang.UnsupportedClassVersionError: Unsupported_Class_Version_Error : Unsupported major.minor version 52.0.

Solucione el java.lang.UnsupportedClassVersionError

Hay dos condiciones para este error, por lo que la solución se encuentra en estas dos condiciones:

  1. Ejecute el código con los últimos JDK y JRE.
  2. Compile el código con la versión anterior de JDK para que coincida con el tiempo de ejecución de JDK.
  3. Una solución simple es utilizar la compilación cruzada de Java. Si el JDK del entorno de producción es inferior al entorno de compilación, podemos generar un archivo de clase con una versión inferior mediante la compilación cruzada.

El siguiente comando se usará para crear un archivo de clase para el código anterior:

javac -target 1.7 Unsupported_Class_Version_Error.java

Como se mencionó anteriormente, la solución es construir la aplicación con las mismas versiones en tiempo de compilación y ejecución, o al menos la versión en tiempo de compilación es menor que la versión en tiempo de ejecución.

El error anterior muestra el problema de las versiones Major Minor. Las versiones Major Minor son las versiones de JRE; por ejemplo, para JRE 8, la versión principal es 52.0.

Debemos asegurarnos de que no ocurran problemas con la versión Major Minor al compilar y ejecutar el archivo Java Class. La lista de las versiones de JRE que son compatibles con la clase son:

Java SE 17 = 61,
Java SE 16 = 60,
Java SE 15 = 59,
Java SE 14 = 58,
Java SE 13 = 57,
Java SE 12 = 56,
Java SE 11 = 55,
Java SE 10 = 54,
Java SE 9 = 53,
Java SE 8 = 52,
Java SE 7 = 51,
Java SE 6.0 = 50,
Java SE 5.0 = 49,
JDK 1.4 = 48,
JDK 1.3 = 47,
JDK 1.2 = 46,
JDK 1.1 = 45
Sheeraz Gul avatar Sheeraz Gul avatar

Sheeraz is a Doctorate fellow in Computer Science at Northwestern Polytechnical University, Xian, China. He has 7 years of Software Development experience in AI, Web, Database, and Desktop technologies. He writes tutorials in Java, PHP, Python, GoLang, R, etc., to help beginners learn the field of Computer Science.

LinkedIn Facebook

Artículo relacionado - Java Error