NoSuchMethodError

Este erro ocorre quando é realizada uma chamada para um método de uma classe que não existe. Normalmente este erro é pego pelo compilador, que não permite compilar uma chamada para um método que não existe. Caso uma classe seja carregada dinamicamente, pode ocorrer uma chamada para um método que não existe.

Geralmente há uma mensagem neste padrão:

java.lang.NoSuchMethodError: <nome método que não existe>

Para uma melhor compreensão do erro, será gerado um pequeno programa Java para causar este erro:

1) Crie um arquivo chamado Principal.java, com este código:

public class Principal {

public static void main(String[] args) throws Exception {

Segunda segunda = new Segunda();

int valor = segunda.teste();

}

}

2) Crie um arquivo chamado Segunda.java, com este código:

public class Segunda {

public static void main(String[] args) {

}

public int testes () {

return 10;

}

}

3) Compile os programas em Java Principal.java e Segunda.java:

javac *.java

Principal.java:4: cannot find symbol

symbol : method teste()

location: class Segunda

int valor = segunda.teste();

^

1 error

Foi tentado chamar o método teste() da classe Segunda.class, que não existe, pois o método correto é testes(), no plural. Veja que não foi possível compilar o programa.

4) Agora altere o programa Principal.java, mudando de teste para testes:

public class Principal {

public static void main(String[] args) throws Exception {

Segunda segunda = new Segunda();

int valor = segunda.testes();

}

}

5) Compile os programas em Java Principal.java e Segunda.java:

javac *.java

* Desta vez não ocorreram erros

6) Execute o programa:

java Principal

* Nenhuma mensagem apareceu, então o programa funcionou

Agora vamos simular uma alteração na classe Segunda.java, onde o nome do método foi alterado.

7) Edite a classe Segunda.java, e remove um “s” da método testes:

public class Segunda {

public static void main(String[] args) {

}

public int teste () {

return 10;

}

}

8) Compile o programa em Java Segunda.java:

javac Segunda.java

* Não alteramos o programa Principal.java, que continua com a chamada antiga

9) Execute o programa:

java Principal

Exception in thread "Main Thread" java.lang.NoSuchMethodError: Segunda.testes()

at Principal.main(Principal.java:4)

* A exceção ocorreu porque alteramos o método de uma classe e não atualizamos a outra, ao tentar chamar o método testes(), não encontra, pois foi alterado para teste()

Este erro é muito comum, pois um sistema é composto por centenas de classes e, muitas vezes são executadas no ambiente do desenvolvedor, quando é executada, em um ambiente de teste ou produção, alguma classe que foi atualizada, deixa de ser copiada para o servidor que faz a chamada para uma classe antiga, que não tem o método ou tem mas foi alterado.