Heim  >  Artikel  >  Java  >  Ursachen und Lösungen für die NoSuchMethodError-Ausnahme in Java

Ursachen und Lösungen für die NoSuchMethodError-Ausnahme in Java

PHPz
PHPzOriginal
2023-06-24 22:19:333916Durchsuche

Ursachen und Lösungen für NoSuchMethodError-Ausnahmen in Java

Java ist eine der beliebtesten Programmiersprachen der Welt. Sie zeichnet sich durch plattformübergreifende, objektorientierte und sichere Eigenschaften aus. Bei der Entwicklung von Java-Programmen treten häufig verschiedene Ausnahmen auf. Unter diesen ist auch die NoSuchMethodError-Ausnahme eine der sehr häufigsten Ausnahmen. In diesem Artikel werden die Ursachen und Lösungen von NoSuchMethodError-Ausnahmen vorgestellt.

1. Ursachen

Wenn bei der Java-Programmentwicklung eine nicht vorhandene Methode aufgerufen wird, tritt eine NoSuchMethodError-Ausnahme auf. Es gibt zwei Situationen:

1. Die Methode ist zur Kompilierungszeit vorhanden, kann aber zur Laufzeit nicht gefunden werden.

Beim Kompilieren von Java-Code prüft der Java-Compiler alle Methoden der Klasse, wenn eine Methode nicht vorhanden ist oder die Signatur nicht vorhanden ist Übereinstimmung, die Kompilierung schlägt fehl. Wenn der Code jedoch zur Laufzeit eine Methode aufruft, die nicht vorhanden ist, wird eine NoSuchMethodError-Ausnahme generiert.

Zum Beispiel generiert der folgende Code eine NoSuchMethodError-Ausnahme:

public class Test {
    public static void main(String[] args) {
        int sum = add(1, 2, 3);
        System.out.println(sum);
    }

    public static int add(int a, int b) {
        return a + b;
    }
}

In diesem Code rufen wir die Add-Methode in der Hauptmethode auf und übergeben drei Parameter, aber die Add-Methode kann nur zwei Parameter akzeptieren, sodass die Kompilierung fehlschlägt . Wenn wir jedoch stattdessen zwei Parameter übergeben, wird die Kompilierung erfolgreich sein. Da die von uns aufgerufene Add-Methode jedoch zur Laufzeit drei Parameter übergab, trat eine NoSuchMethodError-Ausnahme auf.

2. Zur Laufzeit gibt es eine Methode, die aber nicht aufgerufen wird

Wenn in einem Java-Programm eine Klasse in eine .class-Datei kompiliert wurde, aber zur Laufzeit nicht verwendet wird, lädt die JVM die Klasse nicht. und es wird nicht verwendet. Die Methoden in dieser Klasse werden nicht aufgerufen. Wenn Sie jedoch später eine Methode in dieser Klasse verwenden müssen und diese Methode geändert wurde, wird eine NoSuchMethodError-Ausnahme generiert.

Hier sind zum Beispiel zwei Versionen der Klasse:

public class Test {
    public static void main(String[] args) {
        A a = new A();
        a.sayHello();
    }
}

class A {
    public void sayHello() {
        System.out.println("Hello, World!");
    }
}

Eine andere Version:

public class Test {
    public static void main(String[] args) {
        A a = new A();
        a.sayHello("Java");
    }
}

class A {
    public void sayHello(String name) {
        System.out.println("Hello, " + name + "!");
    }
}

Wenn wir zuerst die erste Version der Klasse und dann die zweite Version der Klasse ausführen, wird eine NoSuchMethodError-Ausnahme generiert, weil The sayHello Die Methode in der zweiten Version der Klasse hat sich geändert, aber die JVM hat nicht diese neue Version der Klasse, sondern die alte Version der Klasse geladen, sodass eine NoSuchMethodError-Ausnahme generiert wird, wenn die neue Version der sayHello-Methode aufgerufen wird .

2. Lösung

Der Grund, warum die NoSuchMethodError-Ausnahme auftritt, ist komplizierter, daher müssen wir unterschiedliche Lösungen anwenden.

1. Eine Methode ist zur Kompilierungszeit vorhanden, kann aber zur Laufzeit nicht gefunden werden.

Wenn eine Methode zur Kompilierungszeit vorhanden ist, aber zur Laufzeit nicht gefunden werden kann, können Sie das Problem unter folgenden Gesichtspunkten beheben:

(1) Bestätigen Sie, ob die Methode existiert

Stellen Sie sicher, dass die Methode, die Sie aufrufen, tatsächlich existiert. Sie können bestätigen, ob die Methode vorhanden ist, indem Sie beispielsweise Reflektion verwenden:

public class Test {
    public static void main(String[] args) throws Exception {
        Class cls = Class.forName("com.example.A");
        Method method = cls.getMethod("add", int.class, int.class);
        System.out.println(method);
    }
}

class A {
    public int add(int a, int b) {
        return a + b;
    }
}

In diesem Code verwenden wir Reflektion, um die Add-Methode in Klasse A zu erhalten. Wenn die Add-Methode zur Laufzeit nicht gefunden werden kann, wird eine Ausnahme generiert.

(2) Überprüfen Sie, ob die Signatur der Methode übereinstimmt.

Die Methodensignatur ist eine eindeutige Zeichenfolge, die für die Methode definiert ist und normalerweise den Methodennamen, den Parametertyp, den Rückgabetyp und andere Informationen enthält. Wenn die Methodensignatur zur Kompilierungszeit nicht mit der zur Laufzeit übereinstimmt, wird eine NoSuchMethodError-Ausnahme generiert.

(3) Bestätigen Sie, ob die Klasse, in der sich die Methode befindet, korrekt geladen wurde.

Stellen Sie sicher, dass die Klasse, in der sich die Methode befindet, korrekt geladen wurde. Sie können bestätigen, ob die Klasse geladen ist, indem Sie den vollständig qualifizierten Namen der Klasse ausdrucken, zum Beispiel:

public class Test {
    public static void main(String[] args) {
        A a = new A();
        System.out.println(a.getClass().getName());
    }
}

class A {
    public void sayHello() {
        System.out.println("Hello, World!");
    }
}

In diesem Code drucken wir den vollständig qualifizierten Namen der Klasse aus, in der sich ein Objekt befindet, um zu bestätigen, ob die Klasse geladen ist korrekt.

(4) Bestätigen Sie, ob die Klasse, in der sich die Methode befindet, korrekt importiert wurde.

Stellen Sie sicher, dass die Klasse, in der sich die Methode befindet, korrekt importiert wurde. Wenn Sie Code von einer anderen Stelle kopieren, aber die entsprechende Klasse nicht korrekt importieren, tritt eine NoSuchMethodError-Ausnahme auf.

2. Eine Methode existiert zur Laufzeit, wird aber nicht aufgerufen

Wenn eine Methode zur Laufzeit existiert, aber nicht aufgerufen wird, können Sie das Problem durch die folgenden Methoden lösen:

(1) Cache leeren

Sicherstellen durch Cache leeren Die JVM lädt die neue Version der Klasse korrekt. In Windows-Systemen können Sie den folgenden Befehl in cmd eingeben, um den Java-Cache zu leeren:

javaws -clearcache

(2) Neu kompilieren

Kompilieren Sie den Code erneut und führen Sie ihn erneut aus.

(3) Verwenden Sie die neue Version der Klasse

Stellen Sie sicher, dass Sie die neue Version der Klasse anstelle der alten Version der Klasse verwenden.

(4) Ändern Sie den Namen der Klasse

Wenn Sie den Namen einer Klasse ändern müssen, wird empfohlen, alle Methoden in der Klasse gleichzeitig zu ändern, um sicherzustellen, dass in Unterklassen, die dies erben, keine NoSuchMethodError-Ausnahme auftritt Klasse.

3. Zusammenfassung

NoSuchMethodError-Ausnahme ist ein häufiges Problem bei der Java-Programmentwicklung. Zu den Gründen für dieses Problem gehören Methoden, die zur Kompilierungszeit vorhanden sind, aber zur Laufzeit nicht gefunden werden können, Methoden, die zur Laufzeit vorhanden sind, aber nicht aufgerufen werden usw. Zu den Methoden zur Lösung dieses Problems gehören hauptsächlich die Bestätigung, ob die Methode vorhanden ist, die Überprüfung, ob die Methodensignatur übereinstimmt, die Bestätigung, ob die Klasse, in der sich die Methode befindet, korrekt geladen ist, die Bestätigung, ob die Klasse, in der sich die Methode befindet, korrekt importiert ist usw. Bei der Entwicklung von Java-Programmen müssen Sie auf den Unterschied zwischen Kompilierung und Laufzeit achten und je nach Situation eine geeignete Lösung auswählen.

Das obige ist der detaillierte Inhalt vonUrsachen und Lösungen für die NoSuchMethodError-Ausnahme in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn