Estoy recibiendo un NoSuchFieldError en mi código, ahora que oracle no está muy claro el motivo de este error se produce sólo diciendo: este error sólo puede producirse en tiempo de ejecución si la definición de una clase tiene incompatibilidad cambiado.

Puede que alguien me explique cómo se puede ‘incompatibilidad cambio de clase? La clase de la que estoy hablando se extiende bastante adjudicar de clases así que sospecho que podría tener que ver con eso, pero no sé por dónde empezar a buscar o lo que yo estoy buscando.

  • Probablemente sería de ayuda si usted incluyó un seguimiento de pila o simplemente una alusión a lo que intentó hacer.
  • puedes publicar algo de código?
  • Bueno, tengo una clase calles LuaUserdata que representa un Lua Userdata valor (usted puede olvidarse de lua, su relación alguna) esta clase tiene un campo llamado m_metatable, LuaUserdata se extiende por clase ‘a’, ‘a’ extendido por ‘b’ y, finalmente, de la clase ‘e’ por ‘Parte’. Cuando intento acceder al campo m_metatable en «Parte» me sale este error, lo cual es extraño ya que el campo de ins no acceder una sola vez en las clases a,b,etc, y todas las clases que extienden la ‘d’ todavía puede tener acceso al campo.
InformationsquelleAutor Timotheus | 2011-07-13

7 Comentarios

  1. 62

    Este error normalmente se produce si se sólo parcialmente volver a compilar el código. Tienes antiguo código que hace referencia a un campo que ya no existe en recompilar los archivos de clase.

    La solución es limpiar todos los archivos de clase y compilar todo, desde fresca.

    Actualización: Si sigue apareciendo el mismo error después de recompilar todo, entonces usted está probablemente compilar contra una versión de una biblioteca externa y el uso de otra en tiempo de ejecución.

    Lo que usted necesita hacer ahora es primero identificar la clase que está causando el problema (parece que han hecho ya) y, a continuación, ejecutar la aplicación con la -verbose:class opción de línea de comandos. Se va a volcar un montón de clase de la carga de la información en su salida estándar y usted será capaz de encontrar donde se encuentra la problemática de la clase es exactamente cargado de.

    • Hice lo que dijiste y limpiar/a compilar, pero me temo que no resuelve nada
    • Hice mi actualización ayudar?
    • Sí, como he comentado en Paŭlo la respuesta que he tratado de omitir algunas clases de una biblioteca y supongo que está siendo problemático. Cualquier consejo sobre la sustitución de las clases específicas de una biblioteca sin tener que reconstruir toda la biblioteca? Yo simplemente no puede extender de ellos, ya que las necesito para extender algo así.
    • Si usted compilar y ejecutar la aplicación con el mismo frascos (y están en el mismo orden), usted no debe recibir este mensaje de error. Lo que usted necesita hacer ahora es, primero, identificar la clase que está causando el problema (parece que han hecho ya) y, a continuación, ejecutar la aplicación con la -verbose:class opción de línea de comandos. Se va a volcar un montón de clase de la carga de la información en su salida estándar y usted será capaz de encontrar donde se encuentra la problemática de la clase es exactamente cargado de.
    • … y usted debe quitar el infractor frasco de su classpath y que debe asegurarse de que el otro (correcto) copia será recogido.
    • Veo, muchas gracias por su ayuda y solución
    • excelente respuesta @biziclop . Funciona si está limpio compilación se lleva a cabo.
    • como @biziclop dijo, un mvn clean install fue suficiente

  2. 7

    Cuando el compilador compila el código que está tirando el error, había otra clase con un campo, y su clase se puede acceder a este campo (ya sea de lectura o cambiar el valor).

    En tiempo de ejecución, la otra clase de alguna manera no tiene campo con este nombre, que se traduce en el mencionado error.

    Una de las razones podría ser que la segunda clase cambiado sin que la primera se vuelve a compilar.
    Vuelva a compilar todas las clases, y usted debe recibir un error del compilador (que le dará más información sobre cómo solucionar este), o la clase de referencia de la clase de derecho.

    Otra razón podría ser que usted tiene cierta clase en más de un tarro de archivo (o directorio) en la ruta de clase (en diferentes versiones), lo que en algunos otros de la clase utilizando el equivocado. Revise todos los frascos en duplicado en clases.

    • La segunda razón es probablemente mi problema, como he tratado de reemplazar algunas clases de una biblioteca.
  3. 4

    Algo que tener cuidado al realizar el seguimiento de estos errores en un IDE (Eclipse en mi caso) es para ver las dependencias de los proyectos de su proyecto puede depender. Si utiliza distintas versiones de una biblioteca en diferentes proyectos dependientes, la ruta de clase loader puede recoger el equivocado. Esto incluye tener un proyecto depende de un frasco creado a partir de un proyecto de Eclipse, y tener otro proyecto depende de que el proyecto y el proyecto que el frasco se generó a partir de. El anticuado clases en el frasco que potencialmente podrían ser cargado en lugar de la de las clases del proyecto.

    Ejemplo:

    project1 depende de project2 y project3

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

    Un último campo estático es añadido a una clase en project2, que se vuelve a compilar
    mientras project2.jar no se reconstruye

    Ejecución project1 puede causar la excepción, ya que las clases de project2 puede ser cargado desde el proyecto directamente O el frasco, que no tiene el campo

    • Esto es exactamente lo que estoy teniendo en mi proyecto ahora mismo. Ahora sé dónde buscar. Tú eres mi salvador, gracias.
  4. 3

    Significa que usted tiene probablemente a compilar una clase que se dependía por otro ya compilado clase – y no vuelve a compilar la función de la clase.

    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;
        }
    }

    Para que vuelva a compilar las dos clases, presumiblemente por la mano (un IDE normalmente actualizar el proyecto de área de trabajo para usted para manejar en función de las clases).

    Y funcionó.

    Más tarde decide a refactorizar MyClass:

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

    Si compila MyClass y no MyDependingClass, cuando ejecuta el programa y crear una instancia de MyDependingClass, a continuación, usted recibirá su NoSuchFieldError.

    La solución a corto plazo es, probablemente, volver a compilar todas las clases en su área de trabajo, que debe mostrar el error.

    El largo plazo la solución es utilizar Eclipse o NetBeans u otro IDE que se encarga de esto para usted.

    • Estoy usando NetBeans y volver a compilar todo, pero no cambiar una cosa
  5. 0

    Fue muy difícil para mí, así que estoy escribiendo mi solución.

    Yo estaba trabajando en IntelliJ con el Inicio todo fue bien, todos Java 8 versiones se han configurado correctamente.

    Después de algunas horas, de alguna manera marcada en la terminal de la javac -version y supongo que lo era a la versión 9. Así que asegúrate de mirar para javac, sé que es contradictorio, pero supuestamente, ya me había puesto el jdk en el perfil de bash, en IntelliJ etc, yo no tengo por qué se molestan de ella.

    Espero que ayude!

    • No creo que se trata de una versión de java problema, ya que el campo está ahí, cualquier versión del jdk no se la perderá.
  6. 0

    Entender este error:

    Este es un java.lang.LinkageError error que ocurre cuando la jvm intenta enlazar la carga de clases. Tenga en cuenta que el código es en primer lugar compilado(con las clases dependientes), entonces todos los involucrados las clases se cargan por la jvm, y, a continuación, estas clases están vinculadas entre sí.

    Pensar sobre el error:NoSuchField, significa que cuando la vinculación de la clase de destino, el campo no está allí. Pero al compilar, la clase debe tener ese campo, de lo contrario el código cann’t compilar. Cuando se conecta, la jvm considera que ese campo no está allí. Así que la única razón es que estamos recopilando con una clase con ese campo, y otra versión de esa clase(que no tienen ese campo) se carga y vinculados.


    Decidir su situación entre dos razones más comunes para este error

    Generalmente el mal cargados de clase es un código fuente se ha modificado, o una clase en uno de sus dependientes paquete jar. Podemos decidir esto por la búsqueda de la mal cargados de clase mediante la adición de -verbose:class argumento a la jvm que está tratando de ejecutar la aplicación, en su ide. Este argumento impresión de todo el cargado de las clases en la consola. En eclipse se coloca en : haga clic derecho sobre el proyecto-> ejecutar como-> ejecutar configrations->la arguments tag->VM arguement campo.

    Después de encontrar el mal cargados de clase, por lo general es una clase que tiene el código fuente de su proyecto, o es un paquete jar para que su proyecto está en función.
    Diferente situación conduce a soluciones diferentes.


    Solución para la fuente de código de caso:

    Probable que haya cambiado de clase(añadiendo el campo en el código fuente), pero no compilar. Es posible que debido a diferentes razones, pero usted debe eliminar la versión antigua compilado .class archivo de esa clase, y compilarlo para permitir que la nueva versión .class archivo contiene ese campo.


    Solución para el paquete jar caso:

    Usted debe tratar de dejar el proyecto de carga de la correcta paquete jar. Pero, ¿por qué una versión diferente es la que se encarga generalmente es debido a que ambos son dependía(por diferentes partes de su proyecto). La situación es mucho más simple(y no existe en el mundo real del proyecto ), si usted escribe los códigos que directamente dependen de ellos, sólo tienes que elegir uno y colocar otra.

    Pero lo más probable es que su código indirectamente dependen de ellos. Y usted no desea cambiar el código(o cambiar lo menos posible).

    Una solución es que usted escribe su propio ClassLoader para paly con ambos:La posibilidad de utilizar dos clases de java con el mismo nombre y el mismo paquete? (yo no lo intente)

    Si usted elige para cargar la versión correcta(que contengan tales field), y el código que, indirectamente, dependiendo de la wrong versión todavía puede trabajar(hopingfully), entonces tenemos un tanto sencillo, solución: deje que su proyecto elegir la versión correcta.

    Tomar eclipse por ejemplo, puede utilizar el Order and Export de la etiqueta en la Java Build Path propiedad, simplemente ajuste el fin de permitir la correcta versión estar delante de la wrong versión, ya que la función de Order parte es :

    Por un lado, funciona como el orden de resolución de los recursos
    utilizado en la construcción del proyecto en cuestión (la «Orden» de la parte).

    Si la versión correcta o equivocada versión no aparece allí, usted debe determinar qué paquete está en función y ajustar su fin, debido a la función de Export parte . Leer El «Orden y la Exportación» en «Java Build Path» para más detalles.

  7. 0

    Aunque la causa subyacente es la misma que la descrita en la parte superior respuestas, mi problema era un poco diferente de las otras respuestas que he encontrado por aquí, así que pensé en compartir.

    Estoy trabajando en un gran proyecto que tiene varios maven poms reparten durante todo el proyecto. Un colega actualizado el número de versión de una de las dependencias sin actualizar cada lugar en el que la dependencia apareció, lo que resulta en que no coinciden las bibliotecas en el classpath.

    La solución fue actualizar cada una de las ocurrencias de esta dependencia para tener el mismo número de versión. Como una nota del lado, para evitar que esto suceda de nuevo hemos añadido una variable allí y ahora podemos controlar el número de versión de las dependencias que a partir de un punto.

Dejar respuesta

Please enter your comment!
Please enter your name here