NoSuchMethodError Java-ban

1. Áttekintés

Ebben az oktatóanyagban megnézzük a java.lang.NoSuchMethodError és néhány módja annak kezelésére.

2. NoSuchMethodError

Ahogy a neve is sugallja, a NoSuchMethodError akkor fordul elő, ha egy adott módszer nem található. Ez a módszer lehet példányos vagy statikus módszer.

A legtöbb esetben,képesek vagyunk lefordítani ezt a hibát fordítási időben. Ennélfogva, ez nem nagy kérdés. Azonban, néha futás közben is dobni lehetett, akkor kissé nehézzé válik annak megtalálása. Az Oracle dokumentációja szerint ez a hiba futás közben fordulhat elő, ha az osztály kompatibilisen megváltozott.

Ezért a következő esetekben találkozhatunk ezzel a hibával. Először, ha csak részleges újrafordítást hajtunk végre kódunk. Másodszor, ha van verzió kompatibilitás a függőségekkel alkalmazásunkban, például a külső edényekben.

Vegye figyelembe, hogy a NoSuchMethodError az örökösödési fa magában foglalja IncompatibleClassChangeError és LinkageError. Ezek a hibák összeegyeztethetetlen osztályváltással társulnak a fordítás után.

3. Példa NoSuchMethodError

Lássuk ezt a hibát egy példával. Ehhez két osztályt hozunk létre. Az első az SpecialToday amely felsorolja az aznapi akciókat egy étteremben:

public class SpecialToday {private static String desert = "Csokoládétorta"; public static String getDesert () {return desert; }}

A második osztály Főmenü metódusokat hív Akciós termékek:

public class MainMenu {public static void main (String [] args) {System.out.println ("Mai akciók:" + getSpecials ()); } public static String getSpecials () {return SpecialToday.getDesert (); }}

Itt a kimenet a következő lesz:

Mai különlegességek: Csokoládétorta

Ezután töröljük a getDesert () metódust a SpecialToday és csak ezt a frissített osztályt fordítsa újra. Ezúttal, amikor futunk Főmenü, a következő futásidejű hibát észleljük:

Kivétel a "main" szálban java.lang.NoSuchMethodError: SpecialToday.getDesert () Ljava / lang / String;

4. Hogyan kell kezelni NoSuchMethodError

Most nézzük meg, hogyan tudjuk ezt kezelni. A fenti kódnál tegyük meg végezz egy teljes tiszta fordítást, beleértve az osztályokat is. Észre fogjuk venni, hogy a hibát a fordítás közben elkapjuk. Ha használjuk egy IDE, mint az Eclipse, még korábban észlelik, amint frissítjük KülönlegességekMa.

Ennélfogva, ha belefutunk ebbe a hibába az alkalmazásainkkal, első lépésként egy teljesen tiszta fordítást hajtunk végre. Mavennel lefuttatjuk a mvn tiszta telepítés parancs.

Néha a probléma az alkalmazás külső függőségeivel van. Ebben az esetben először mi fogunk ellenőrizze az üvegek sorrendjét az osztályútvonal-betöltő által húzott építési útvonalon. És nyomon követjük és frissítjük az inkonzisztens korsót.

Ha azonban futás közben is találkozunk ezzel a hibával, akkor mélyebbre kell ásnunk. Muszáj lesz győződjön meg arról, hogy a Compile-time és a Runtime osztályoknak és üvegeknek ugyanazok a verziói vannak. Ehhez megtehetjük futtassa az alkalmazást a -verbose: class opcióval a betöltött osztályok ellenőrzéséhez. A parancsot az alábbiak szerint futtathatjuk:

$ java -verbose: class com.baeldung.exceptions.nosuchmethoderror.MainMenu [0.014s] [info] [osztály, betöltés] megnyitva: / usr / lib / jvm / java-11-openjdk-amd64 / lib / modules [0.015s ] [info] [osztály, betöltés] megnyitva: /usr/share/java/java-atk-wrapper.jar [0.028s] [info] [osztály, betöltés] java.lang.Object forrás: megosztott objektumok fájlja [0.028s ] [info] [osztály, betöltés] java.io.Serializálható forrás: megosztott objektumok fájl

Ezeknek az információknak a felhasználása az egyes üvegekbe töltött futamidő alatt az összes össze nem egyeztethető függőséget felhasználva.

Nekünk is győződjön meg arról, hogy nincsenek ismétlődő osztályok két vagy több üvegben. A legtöbb esetben a maven segít az ütköző függőségek ellenőrzésében közvetlenül. Ezenkívül futtathatjuk a mvn függőség: fa parancs a projektünk függőségfájának megszerzéséhez az alábbiak szerint:

$ mvn függőség: fa [INFO] Projektek keresése ... [INFO] [INFO] --------------------------- [INFO] Épület nosuchmethoderror 0.0.1-SNAPSHOT [INFO] -------------------------------- [jar] ----- ---------------------------- [INFO] [INFO] --- maven-dependency-plugin: 2.8: fa (alapértelmezett-cli ) @ nosuchmethoderror --- [INFO] com.baeldung.exceptions: nosuchmethoderror: jar: 0.0.1-SNAPSHOT [INFO] \ - org.junit: junit-bom: pom: 5.7.0-M1: fordítás

A könyvtárakat és azok verzióit a parancs által létrehozott listában ellenőrizhetjük. Sőt, a függőségeket is kezelhetjük maven címkékkel. Használni a tag, kizárhatjuk a problémás függőséget. Használni a címkével megakadályozhatjuk a nem kívánt függőségek bekerülését a korsóba vagy a háborúba.

5. Következtetés

Ebben a cikkben foglalkoztunk NoSuchMethodError. Megbeszéltük a hiba okát és a kezelésének módjait. A hibák helyes kezelésével kapcsolatos további részletekért olvassa el a Java hibák elkapásával kapcsolatos cikkünket.

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