NoSuchFieldError in Java

1. Overzicht

In dit artikel laten we de reden erachter zien NoSuchFieldError en ontdek hoe u het kunt oplossen.

2. NoSuchFieldError

Zoals de naam al doet vermoeden, NoSuchFieldError treedt op wanneer een opgegeven veld niet bestaat. NoSuchFieldError breidt de IncompatibleClassChangeError klasse en wordt gegooid wanneer de toepassing probeert toegang te krijgen tot een veld van een object of een statisch veld van een klasse, of deze probeert te wijzigen, maar het object of de klasse heeft dat veld niet meer.

IncompatibleClassChangeError klasse breidt de LinkageFout class en treedt op wanneer we incompatibele klassedefinities wijzigen. Tenslotte, LinkageFout strekt zich uit Fout en laat zien dat een klasse afhankelijk is van een andere incompatibel gewijzigde klasse.

Laten we deze fout in actie zien met behulp van een voorbeeld. Laten we als eerste stap een Afhankelijkheid klasse:

publieke klasse afhankelijkheid {public static String message = "Hallo Baeldung !!"; }

Dan maken we een FieldErrorExample klasse die verwijst naar een veld van onze Afhankelijkheid klasse:

openbare klasse FieldErrorExample {openbare statische String getDependentMessage () {return Dependency.message; }}

Laten we ook code toevoegen om te controleren of we een bericht van de Afhankelijkheid klasse:

openbare statische ongeldige fetchAndPrint () {System.out.println (getDependentMessage ()); } 

Nu kunnen we deze bestanden compileren met de Javac commando, en bij uitvoering van het FieldErrorExample klasse met behulp van de Java commando, zal het het gespecificeerde bericht.

Echter, als we commentaar geven, verwijderen of de attribuutnaam in het Afhankelijkheid class en compileer het, dan zullen we onze fout tegenkomen.

Laten we bijvoorbeeld de attribuutnaam in onze Afhankelijkheid klasse:

afhankelijkheid van openbare klassen {public static String msg = "Hallo Baeldung !!"; }

Als we nu alleen onze Afhankelijkheid klasse, en vervolgens uitvoeren FieldErrorExample nogmaals, we zullen de NoSuchFieldError:

Uitzondering in thread "hoofd" java.lang.NoSuchFieldError: bericht

De bovenstaande fout is opgetreden omdat het FieldErrorExample class verwijst nog steeds naar het statische veld bericht van de Afhankelijkheid class, maar het bestaat niet meer - we hebben een onverenigbare wijziging aangebracht in het Afhankelijkheid klasse.

3. De fout oplossen

Om deze fout te voorkomen, moeten we schoon en compileer de bestaande bestanden. We kunnen dit de ... gebruiken Javac commando of met Maven door te draaien mvn schone installatie. Door deze stap uit te voeren, hebben we de nieuwste gecompileerde bestanden en voorkomen we dat we de fout tegenkomen.

Als de fout zich blijft voordoen, is het probleem mogelijk meerdere JAR-bestanden: een tijdens het compileren en een andere tijdens het uitvoeren. Dit gebeurt vaak wanneer de applicatie afhankelijk is van externe JAR's. Hier zouden we moeten zijn valideer de volgorde van de JAR's in het buildpad om de inconsistente JAR te identificeren.

Als we verder moeten onderzoeken, is het nuttig om voer de applicatie uit met -verbose: klasse optieom de geladen klassen te controleren. Dit kan ons helpen de verouderde klas te identificeren.

Soms verwijst een JAR van een derde partij intern naar een andere versie, wat resulteert in NoSuchFieldError. Als dit gebeurt, kunnen we gebruiken mvn-afhankelijkheid: boom -Dverbose. Dit genereert de maven-afhankelijkheidsboom en helpt ons bij het identificeren van de inconsistente JAR.

4. Conclusie

In deze korte tutorial hebben we laten zien waarom NoSuchFieldError gebeurt en is gekeken hoe we het kunnen oplossen.

Zoals altijd is de code beschikbaar op GitHub.