2015-01-14 18 views
12

Non riesco a trovare la differenza esatta tra NoSuchMethodException e NoSuchMethodError in Java. Qualcuno potrebbe dare una spiegazione e un esempio di queste due cose?Differenza tra NoSuchMethodException e NoSuchMethodError in Java

+1

NoSuchMethodException si verifica quando chiami un metodo in cui potresti aspettarti che manchi il metodo di destinazione. NoSuchMethodError si verifica quando manca il metodo, ma normalmente non sarebbe il codice normale. –

risposta

1

Class NoSuchMethodException:

generata quando un particolare metodo non può essere trovato.

Class NoSuchMethodError

generata se un'applicazione tenta di chiamare un metodo di una classe (statica o esempio), e quella classe specificata non ha più una definizione di tale metodo.

Vedere anche questo article, lo spiega meglio.

+0

Hai Maroun: non riesco a capire "la classe non ha più una definizione di quel metodo" Per favore spiega questa affermazione. – Balasubramani

+4

Ciò significa che la classe chiamante non è a conoscenza della classe modificata. Il metodo era lì quando la classe chiamante è stata compilata ma durante il runtime - qualcosa è cambiato e non è più in grado di trovarlo più – shikjohari

+0

Grazie a Shikjohari per la tua chiara spiegazione. – Balasubramani

22

NoSuchMethodException può essere generato quando si richiama un metodo tramite reflection e il nome del metodo proviene da una variabile nel programma.

NoSuchMethodError può essere generato quando una classe Java compilata esegue una chiamata di metodo normale a un'altra classe e il metodo non esiste. (Questo di solito accade quando la classe chiamante è compilata contro una versione della classe chiamata ed è eseguita insieme ad un'altra versione di quella classe, che non ha più il metodo.)

+0

Informazioni sul caso 'NoSuchMethodException', il nome del metodo deve effettivamente provenire da una variabile per far sì che questa eccezione venga generata? – SantiBailors

+0

Beh, potrebbe essere un campo, o il risultato di chiamare un metodo o valutare un'espressione. – yole

+0

Certo, in realtà la mia domanda non era troppo chiara, volevo dire che può essere una stringa letterale o costante? – SantiBailors

13

NoSuchMethodException si verifica quando si tenta di richiamare un metodo che usa la riflessione. NoSuchMethodError si verifica quando si utilizzava tale metodo durante la compilazione ma non lo si ha durante il runtime.

consideri il seguente esempio per NoSuchMethodError

Classe: Person.java

public class Person{ 
     public String getName(){ 
     return "MyName"; 
    } 
} 

Compilatelo usando javac Person.java E ora tenta di eseguire questa operazione utilizzando java Person

E 'll darvi

java.lang.NoSuchMethodError: main 
Exception in thread "main" 

perché cerca di trovare il public static void main(String [] args) che non c'è

Per NoSuchMethodException

c = Class.forName("java.lang.String"); 
    try 
    { 
    Class[] paramTypes = new Class[2]; 
    Method m = c.getDeclaredMethod("myMethod", paramTypes); 
    } 

questo è ll un'eccezione dicendo

java.lang.NoSuchMethodException: java.lang.String.myMethod(null, null) 

considerare questo link che ha una spiegazione migliore

4

NoSuchMethodException viene generato quando si tenta di ottenere un metodo che non esiste con la riflessione. Per esempio. chiamando Class#getDeclaredMethod(name, parameters) con il nome o i parametri errati.

NoSuchMethodError viene generata quando la macchina virtuale non riesce a trovare il metodo che si sta tentando di chiamare. Questo può accadere quando si compila con una versione di una libreria e successivamente si esegue l'applicazione con un'altra versione della libreria sul classpath (ad esempio una più vecchia che non ha il metodo che si sta chiamando)