Maison  >  Article  >  Java  >  Causes et solutions à l'exception NoSuchMethodError en Java

Causes et solutions à l'exception NoSuchMethodError en Java

PHPz
PHPzoriginal
2023-06-24 22:19:333985parcourir

Causes et solutions aux exceptions NoSuchMethodError en Java

Java est l'un des langages de programmation les plus populaires au monde. Il présente les caractéristiques multiplateformes, orientées objet et de sécurité. Dans le développement de programmes Java, diverses exceptions sont souvent rencontrées. Parmi elles, l’exception NoSuchMethodError est également l’une des exceptions les plus courantes. Cet article présentera les causes et les solutions des exceptions NoSuchMethodError.

1. Causes

Dans le développement de programmes Java, si une méthode inexistante est appelée, une exception NoSuchMethodError se produira. Il existe deux situations :

1. La méthode existe au moment de la compilation mais est introuvable au moment de l'exécution

Lors de la compilation du code Java, le compilateur Java vérifiera toutes les méthodes de la classe si une méthode n'existe pas ou si la signature n'existe pas. correspond, la compilation échouera. Mais au moment de l'exécution, lorsque le code appelle une méthode qui n'existe pas, une exception NoSuchMethodError est générée.

Par exemple, le code suivant générera une exception NoSuchMethodError :

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;
    }
}

Dans ce code, nous appelons la méthode add dans la méthode main et transmettons trois paramètres, mais la méthode add ne peut accepter que deux paramètres, donc la compilation échouera . Mais si nous passons deux paramètres à la place, la compilation réussira. Mais au moment de l'exécution, comme la méthode add que nous avons appelée a transmis trois paramètres, une exception NoSuchMethodError s'est produite.

2. Il existe une méthode au moment de l'exécution, mais elle n'est pas appelée

Dans un programme Java, si une classe a été compilée dans un fichier .class, mais n'est pas utilisée au moment de l'exécution, la JVM ne chargera pas la classe, et il ne sera pas utilisé. Les méthodes de cette classe seront appelées. Cependant, si vous devez utiliser une méthode de cette classe ultérieurement et que cette méthode a été modifiée, une exception NoSuchMethodError sera générée.

Par exemple, voici deux versions de la classe :

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!");
    }
}

Une autre 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 + "!");
    }
}

Si nous exécutons d'abord la première version de la classe puis la deuxième version de la classe, une exception NoSuchMethodError sera générée car Le sayHello La méthode de la deuxième version de la classe a changé, mais la JVM n'a pas chargé cette nouvelle version de la classe, mais a chargé l'ancienne version de la classe, donc une exception NoSuchMethodError sera générée lorsque la nouvelle version de la méthode sayHello est appelée .

2. Solution

La raison pour laquelle l'exception NoSuchMethodError se produit est plus compliquée, nous devons donc adopter différentes solutions.

1. Une méthode existe au moment de la compilation mais est introuvable au moment de l'exécution

Si une méthode existe au moment de la compilation mais est introuvable au moment de l'exécution, vous pouvez résoudre le problème sous les aspects suivants :

(1) Confirmez si le la méthode existe

Assurez-vous que la méthode que vous appelez existe réellement. Vous pouvez utiliser la réflexion pour confirmer si la méthode existe, par exemple :

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;
    }
}

Dans ce code, nous utilisons la réflexion pour obtenir la méthode add dans la classe A. Si la méthode add est introuvable au moment de l’exécution, une exception sera générée.

(2) Vérifiez si la signature de la méthode correspond

La signature de la méthode est une séquence unique de caractères définie pour la méthode, comprenant généralement le nom de la méthode, le type de paramètre, le type de retour et d'autres informations. Si la signature de la méthode au moment de la compilation est incohérente avec celle au moment de l'exécution, une exception NoSuchMethodError sera générée.

(3) Confirmez si la classe où se trouve la méthode a été chargée correctement

Assurez-vous que la classe où se trouve la méthode a été chargée correctement. Vous pouvez confirmer si la classe est chargée en imprimant le nom complet de la classe, par exemple :

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!");
    }
}

Dans ce code, nous imprimons le nom complet de la classe où se trouve l'objet a pour confirmer si la classe est chargée correctement.

(4) Confirmez si la classe où se trouve la méthode a été importée correctement

Assurez-vous que la classe où se trouve la méthode a été importée correctement. Si vous copiez du code ailleurs mais n'importez pas correctement la classe correspondante, une exception NoSuchMethodError se produira.

2. Une méthode existe au moment de l'exécution, mais n'est pas appelée

Si une méthode existe au moment de l'exécution, mais n'est pas appelée, vous pouvez résoudre le problème via les méthodes suivantes :

(1) Vider le cache

Assurez-vous. en vidant le cache La JVM charge correctement la nouvelle version de la classe. Sur les systèmes Windows, vous pouvez saisir la commande suivante dans cmd pour vider le cache de Java :

javaws -clearcache

(2) Recompile

Recompilez le code et exécutez-le à nouveau.

(3) Utilisez la nouvelle version de la classe

Assurez-vous d'utiliser la nouvelle version de la classe au lieu de l'ancienne version de la classe.

(4) Modifier le nom de la classe

Si vous devez modifier le nom d'une classe, il est recommandé de modifier toutes les méthodes de la classe en même temps pour garantir qu'aucune exception NoSuchMethodError ne se produit dans les sous-classes qui en héritent classe.

3. Résumé

L'exception NoSuchMethodError est un problème courant dans le développement de programmes Java. Les raisons de ce problème incluent les méthodes qui existent au moment de la compilation mais qui sont introuvables au moment de l'exécution, les méthodes qui existent au moment de l'exécution mais qui ne sont pas appelées, etc. Les méthodes pour résoudre ce problème consistent principalement à confirmer si la méthode existe, à vérifier si la signature de la méthode correspond, à confirmer si la classe où se trouve la méthode est correctement chargée, à confirmer si la classe où se trouve la méthode est correctement importée, etc. Lors du développement de programmes Java, vous devez faire attention à la différence entre la compilation et l'exécution et choisir une solution appropriée en fonction de la situation spécifique.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn