NoSuchFieldError a Java-ban

1. Áttekintés

Ebben a cikkben bemutatjuk a mögöttes okokat NoSuchFieldError és fedezze fel, hogyan lehet megoldani.

2. NoSuchFieldError

Ahogy a neve is sugallja, NoSuchFieldError akkor fordul elő, ha egy megadott mező nem létezik. NoSuchFieldError kiterjeszti a IncompatibleClassChangeError osztály és dobják amikor az alkalmazás megpróbálja elérni vagy módosítani egy objektum mezőjét vagy egy osztály statikus mezőjét, de az objektum vagy osztály már nem rendelkezik ezzel a mezővel.

IncompatibleClassChangeError osztály kiterjeszti a LinkageError osztály, és akkor fordul elő, amikor inkompatibilis osztálydefiníciós változásokat hajtunk végre. Végül, LinkageError kiterjed Hiba és azt mutatja, hogy egy osztály függ valamilyen más, összeegyeztethetetlenül megváltozott osztálytól.

Nézzük meg ezt a hibát egy példa segítségével. Első lépésként hozzuk létre a Függőség osztály:

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

Akkor létrehozunk egy FieldErrorExample osztály, amely a mi területünkre utal Függőség osztály:

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

Adjunk hozzá kódot is, hogy ellenőrizzük, kapunk-e a üzenet tól Függőség osztály:

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

Most összeállíthatjuk ezeket a fájlokat a javac parancsot, és a FieldErrorExample osztály a Jáva parancsot, kinyomtatja a megadottakat üzenet.

Azonban, ha megjegyzést fűzünk hozzá, eltávolítjuk vagy megváltoztatjuk az attribútum nevét a Függőség osztályt és fordítsd össze, akkor belefutunk a hibánkba.

Változtassuk meg például az attribútum nevét a Függőség osztály:

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

Most, ha csak a sajátunkat fordítjuk össze Függőség osztály, majd végrehajtani FieldErrorExample ismét találkozunk a NoSuchFieldError:

Kivétel a "main" szálban java.lang.NoSuchFieldError: üzenet

A fenti hiba azért történt, mert a FieldErrorExample osztály még mindig a statikus mezőre utal üzenet a Függőség osztály, de már nem létezik - inkompatibilis változtatást hajtottunk végre a Függőség osztály.

3. A hiba elhárítása

A hiba elkerülése érdekében meg kell tennünk tiszta és fordítsa le a meglévő fájlokat. Meg tudjuk csinálni használni a javac parancs vagy Maven-nel futással mvn tiszta telepítés. Ennek a lépésnek az elvégzésével rendelkezünk a legfrissebb lefordított fájlokkal, és elkerüljük a hiba belefutását.

Ha a hiba továbbra is fennáll, akkor a probléma több JAR fájl lehet: az egyik fordítás közben, egy másik futás közben. Ez gyakran akkor fordul elő, amikor az alkalmazás külső JAR-októl függ. Itt kellene érvényesítse a JAR-ok sorrendjét a build útvonalon az inkonzisztens JAR azonosítására.

Ha tovább kell vizsgálnunk, hasznos futtassa az alkalmazást a -verbose: osztály opcióa betöltött osztályok ellenőrzéséhez. Ez segíthet azonosítani az elavult osztályt.

Előfordulhat, hogy egy harmadik féltől származó JAR belülről hivatkozik egy másik verzióra, ami azt eredményezi NoSuchFieldError. Ha ez megtörténik, használhatjuk mvn függőség: fa -Dverbose. Ez generálja a maven függőségi fát és segít nekünk az inkonzisztens JAR azonosításában.

4. Következtetés

Ebben a rövid bemutatóban megmutattuk miért NoSuchFieldError fordul elő, és megnéztük, hogyan tudjuk megoldani.

Mint mindig, a kód elérhető a GitHubon.