NoSuchFieldError in Java

1. Panoramica

In questo articolo, dimostreremo il motivo dietro NoSuchFieldError e scopriremo come risolverlo.

2. NoSuchFieldError

Come suggerisce il nome, NoSuchFieldError si verifica quando un campo specificato non esiste. NoSuchFieldError estende la classe IncompatibleClassChangeError e viene generata quando l'applicazione tenta di accedere o modificare un campo di un oggetto o un campo statico di una classe ma l'oggetto o la classe non ha più quel campo .

La classe IncompatibleClassChangeError estende la classe LinkageError e si verifica quando si eseguono modifiche alla definizione di classe incompatibili. Infine, LinkageError estende Error e mostra che una classe ha una certa dipendenza da un'altra classe modificata in modo incompatibile.

Vediamo questo errore in azione con l'aiuto di un esempio. Come primo passaggio, creiamo una classe di dipendenza :

public class Dependency { public static String message = "Hello Baeldung!!"; }

Quindi creeremo una classe FieldErrorExample che fa riferimento a un campo della nostra classe Dependency :

public class FieldErrorExample { public static String getDependentMessage() { return Dependency.message; } }

Aggiungiamo anche il codice per verificare se stiamo ricevendo un messaggio dalla classe Dependency :

public static void fetchAndPrint() { System.out.println(getDependentMessage()); } 

Ora, possiamo compilare questi file usando il comando javac e, dopo l'esecuzione della classe FieldErrorExample usando il comando java , stamperà il messaggio specificato .

Tuttavia, se commentiamo, rimuoviamo o cambiamo il nome dell'attributo nella classe Dependency e lo ricompiliamo, ci imbatteremo nel nostro errore .

Ad esempio, cambiamo il nome dell'attributo nella nostra classe di dipendenza :

public class Dependency { public static String msg = "Hello Baeldung!!"; }

Ora, se noi ricompilata solo la nostra dipendenza di classe , e poi eseguiamo FieldErrorExample ancora una volta, ci incontriamo la NoSuchFieldError :

Exception in thread "main" java.lang.NoSuchFieldError: message

L'errore precedente si è verificato perché la classe FieldErrorExample fa ancora riferimento al messaggio del campo statico della classe Dependency , ma non esiste più: abbiamo apportato una modifica incompatibile alla classe Dependency .

3. Risoluzione dell'errore

Per evitare questo errore, dobbiamo pulire e compilare i file esistenti . Possiamo farlo usando il comando javac o con Maven eseguendo mvn clean install. Eseguendo questo passaggio, avremo tutti i file compilati più recenti ed eviteremo di incorrere nell'errore.

Se l'errore persiste, il problema potrebbe essere costituito da più file JAR: uno durante la compilazione e un altro durante l'esecuzione. Ciò accade spesso quando l'applicazione dipende da JAR esterni. Qui, dovremmo convalidare l'ordine dei JAR nel percorso di compilazione per identificare il JAR incoerente.

Se dobbiamo indagare ulteriormente, è utile eseguire l'applicazione con l' opzione -verbose: class per controllare le classi caricate. Questo può aiutarci a identificare la classe obsoleta.

A volte un JAR di terze parti potrebbe fare riferimento internamente a un'altra versione, il che si traduce in NoSuchFieldError . Se questo accade, possiamo usare la dipendenza mvn: tree -Dverbose. Questo genera l'albero delle dipendenze maven e ci aiuta a identificare il JAR incoerente.

4. Conclusione

In questo breve tutorial, abbiamo mostrato perché si verifica NoSuchFieldError e abbiamo visto come risolverlo.

Come sempre, il codice è disponibile su GitHub.