NoSuchFieldError Java

Obtengo un NoSuchFieldError en mi código, ahora Oracle no tiene muy claro por qué se emite este error, solo dice: este error solo puede ocurrir en tiempo de ejecución si la definición de una clase ha cambiado de manera incompatible.

¿Puede alguien explicarme cómo se puede ‘cambiar incompatiblemente’ una clase? La clase de la que estoy hablando amplía bastante las clases, así que sospecho que podría tener que ver con eso, pero no sé por dónde empezar a buscar o qué estoy buscando.

Este error generalmente se produce si solo recomstack parcialmente su código. Tiene un código antiguo que hace referencia a un campo que ya no existe en los archivos de clase recomstackdos.

La solución es limpiar todos los archivos de clase y comstackr todo desde cero.

Actualización: si aún obtiene el mismo error después de volver a comstackr todo, entonces probablemente esté comstackndo contra una versión de una biblioteca externa y utilizando otra en el tiempo de ejecución.

Lo que necesita hacer ahora es primero identificar la clase que está causando el problema (parece que ya lo ha hecho) y luego ejecutar su aplicación con la opción de línea de comandos -verbose:class . Va a descargar mucha información de carga de clases en su salida estándar y podrá averiguar dónde se carga exactamente la clase problemática.

Cuando el comstackdor compiló el código que arroja el error, había alguna otra clase con un campo, y su clase podría acceder a este campo (ya sea leyendo o cambiando el valor).

En tiempo de ejecución, la otra clase de alguna manera no tiene ningún campo con este nombre, lo que da como resultado el error mencionado.

Una razón podría ser que la segunda clase cambió sin que se recomstackra la primera. Vuelva a comstackr todas sus clases y obtendrá un error de comstackción (que le dará más información sobre cómo resolverlo), o la clase hará referencia a la clase correcta.

Otra razón podría ser que tiene alguna clase en más de un archivo jar (o directorio) en la ruta de la clase (en diferentes versiones), lo que da como resultado que otra clase use la incorrecta. Revisa todas tus jarras en clases duplicadas.

Significa que probablemente ha recomstackdo una clase de la que dependía otra clase ya comstackda y no compiló la clase dependiente.

Por ejemplo:

 public class MyClass { public int num; public MyClass() { num = 1; } } public class MyDependingClass { private int foo; public MyDependingClass(MyClass init) { foo = init.num; } } 

Así que recomstack las dos clases, presumiblemente a mano (un IDE normalmente actualizaría el espacio de trabajo del proyecto para usted, así que maneje las clases dependientes).

Y funcionó.

Más tarde decides refactorizar MyClass:

 public class MyClass { private int innernum; public int getNum() { return innernum; } public MyClass() { innernum = 1; } } 

Si comstack MyClass y no MyDependingClass, cuando ejecuta su progtwig y crea una instancia de MyDependingClass, obtendrá su NoSuchFieldError .

El arreglo a corto plazo probablemente sea para recomstackr todas las clases en su área de trabajo, lo que debería mostrar el error.

La solución a largo plazo es usar Eclipse o NetBeans u otro IDE que maneje esto por usted.

Algo de lo que hay que tener cuidado al rastrear estos errores en un IDE (Eclipse en mi caso) es observar las dependencias de los proyectos de los que puede depender su proyecto. Si utiliza diferentes versiones de una biblioteca en diferentes proyectos dependientes, el cargador de ruta de clase puede recoger el incorrecto. Esto incluye que un proyecto dependa de un jar creado a partir de un proyecto de Eclipse, y que otro proyecto dependa de ese proyecto y del proyecto del que se generó el jar. Las clases desactualizadas en el contenedor podrían cargarse potencialmente en lugar de las clases del proyecto.

Ejemplo:

project1 depende de project2 y project2

project3 depende de project2.jar , un jar generado a partir de los archivos de clase en project2

Se agrega un campo estático final a una clase en project2 , que se recomstack, mientras que project2.jar no se reconstruye

Ejecutar project1 puede causar la excepción, ya que las clases de project2 pueden cargarse directamente desde el proyecto O el jar, que no tiene el campo

Fue bastante complicado para mí, así que estoy escribiendo mi solución.

Estaba trabajando en IntelliJ con Boot. Todo estaba bien, todas las versiones de Java 8 se configuraron correctamente.

Después de algunas horas de alguna manera revisé el terminal javac -version y adivinen qué, estaba configurado para la versión 9. Así que asegúrense de buscar javac, sé que es contrario a la intuición, pero supuestamente, desde que configuré el jdk en el perfil bash, en IntelliJ etc., no debería tener que molestarme con eso.

¡Espero eso ayude!