Estou recebendo um NoSuchMethodError
erro ao executar meu programa Java. O que há de errado e como corrigi-lo?
java
nosuchmethoderror
John Meagher
fonte
fonte
Respostas:
Sem mais informações, é difícil identificar o problema, mas a causa principal é que você provavelmente compilou uma classe com uma versão diferente da classe que está faltando um método, além da que você está usando ao executá-lo.
Observe o rastreamento da pilha ... Se a exceção aparecer ao chamar um método em um objeto em uma biblioteca, é provável que você esteja usando versões separadas da biblioteca ao compilar e executar. Verifique se você tem a versão correta nos dois lugares.
Se a exceção aparecer ao chamar um método em objetos instanciados pelas classes que você criou, seu processo de compilação parece estar com defeito. Verifique se os arquivos de classe que você está realmente executando são atualizados ao compilar.
fonte
Caused by
seção no rastreamento de pilha para encontrar a classe / jarEu estava tendo seu problema, e foi assim que eu o corrigi. As etapas a seguir são uma maneira prática de adicionar uma biblioteca. Eu tinha feito os dois primeiros passos corretamente, mas não o último, arrastando o arquivo ".jar" diretamente do sistema de arquivos para a pasta "lib" no meu projeto eclipse. Além disso, eu tive que remover a versão anterior da biblioteca do caminho de compilação e da pasta "lib".
Etapa 1 - adicione .jar para criar o caminho
Etapa 2 - Associar fontes e javadocs (opcional)
Etapa 3 - Arraste o arquivo .jar para a pasta "lib" (não opcional)
fonte
Observe que, no caso de reflexão, você recebe um
NoSuchMethodException
, enquanto que com código não reflexivo, recebeNoSuchMethodError
. Costumo procurar em lugares muito diferentes quando confrontados com um contra o outro.fonte
Se você tiver acesso para alterar os parâmetros da JVM, a inclusão de saída detalhada deve permitir que você veja quais classes estão sendo carregadas a partir de quais arquivos JAR.
Quando seu programa é executado, a JVM deve despejar para obter informações padronizadas, como:
fonte
Isso geralmente é causado ao usar um sistema de compilação como o Apache Ant que apenas compila arquivos java quando o arquivo java é mais recente que o arquivo de classe. Se uma assinatura de método for alterada e as classes estiverem usando a versão antiga, as coisas poderão não ser compiladas corretamente. A correção habitual é fazer uma reconstrução completa (geralmente "limpeza de formigas" e depois "formigas").
Às vezes, isso também pode ser causado durante a compilação em uma versão de uma biblioteca, mas em execução em uma versão diferente.
fonte
Se você estiver usando o Maven ou outra estrutura, e você receber esse erro quase aleatoriamente, tente uma instalação limpa como ...
Isso provavelmente funcionará se você escreveu o objeto e sabe que ele possui o método. Trabalhou para mim.
fonte
Isso também pode ser o resultado do uso da reflexão. Se você possui um código que reflete em uma classe e extrai um método por nome (por exemplo: with
Class.getDeclaredMethod("someMethodName", .....)
), sempre que o nome do método for alterado, como durante um refator, será necessário lembrar de atualizar os parâmetros para o método de reflexão para corresponder ao nova assinatura de método, ou agetDeclaredMethod
chamada lançará aNoSuchMethodException
.Se esse for o motivo, o rastreamento da pilha deve mostrar o ponto em que o método de reflexão é chamado, e você só precisará atualizar os parâmetros para corresponder à assinatura real do método.
Na minha experiência, isso ocorre ocasionalmente ao testar métodos / campos particulares, e ao usar uma
TestUtilities
classe para extrair campos para verificação de teste. (Geralmente, com código herdado que não foi projetado com o teste de unidade em mente.)fonte
Se você estiver escrevendo um aplicativo da Web, verifique se não possui versões conflitantes de um jar no diretório de biblioteca global do contêiner e também no aplicativo. Você pode não necessariamente saber qual jar está sendo usado pelo carregador de classes.
por exemplo
fonte
Esses problemas são causados pelo uso do mesmo objeto nas mesmas duas classes. Objetos usados não contém novo método foi adicionado que a nova classe de objeto contém.
ex:
Esses problemas são causados pela classe similar 02 concomitante (1 no src, 1 no arquivo jar aqui é gateway.jar)
fonte
Isso significa que o respectivo método não está presente na classe:
fonte
Para mim, isso aconteceu porque alterei o tipo de argumento na função, de Objeto a para String a. Eu poderia resolvê-lo com limpo e construir novamente
fonte
Acabei de solucionar esse erro reiniciando o Eclipse e executando o aplicativo. O motivo do meu caso pode ser porque substituo meus arquivos de origem sem fechar meu projeto ou o Eclipse. O que causou uma versão diferente das classes que eu estava usando.
fonte
Tente desta maneira: remova todos os arquivos .class nos diretórios do seu projeto (e, é claro, todos os subdiretórios). Reconstruir.
Às vezes
mvn clean
(se você estiver usando o maven) não limpa os arquivos .class criados manualmente porjavac
. E esses arquivos antigos contêm assinaturas antigas, levando aNoSuchMethodError
.fonte
Apenas adicionando às respostas existentes. Eu estava enfrentando esse problema com o tomcat no eclipse. Eu mudei uma classe e segui as etapas,
Limpou e construiu o projeto em eclpise
instalação limpa do mvn
Ainda estava enfrentando o mesmo erro. Em seguida , limpei o tomcat, limpei o diretório de trabalho do tomcat e reiniciei o servidor, e meu problema desapareceu. Espero que isso ajude alguém
fonte
Para responder à pergunta original. De acordo com o java docs aqui :
Normalmente, esse erro é detectado pelo compilador; esse erro pode ocorrer apenas em tempo de execução se a definição de uma classe tiver sido alterada incompativelmente.
fonte
Corrigi esse problema no Eclipse renomeando um arquivo de teste do Junit.
No meu espaço de trabalho do Eclipse, tenho um projeto App e um projeto Test.
O projeto Teste tem o projeto App como um projeto necessário no caminho da construção.
Começou a obter o NoSuchMethodError.
Então percebi que a classe no projeto Teste tinha o mesmo nome que a classe no projeto App.
Depois de renomear o teste com o nome correto "ProjectionTest.java", a exceção desapareceu.
fonte
Eu tive o mesmo erro:
Para resolvê-lo, verifiquei, primeiro, o Diagrama de Dependência do Módulo (
click in your POM the combination -> Ctrl+Alt+Shift+U
ouright click in your POM -> Maven -> Show dependencies
) para entender onde exatamente havia o conflito entre as bibliotecas (Intelij IDEA). No meu caso particular, eu tinha versões diferentes das dependências de Jackson.1) Então, adicionei diretamente no meu POM do projeto explicitamente a versão mais alta - 2.8.7 desses dois.
Nas propriedades:
E como dependência:
2) Mas também pode ser resolvido usando Exclusões de Dependência .
Pelo mesmo princípio que abaixo no exemplo:
A dependência com a versão indesejada será excluída do seu projeto.
fonte
No meu caso, eu tinha um projeto com vários módulos e o cenário era como
com.xyz.TestClass
estava no móduloA
e assim como no móduloB
e o móduloA
dependia do móduloB
. Então, ao criar um jar de montagem, acho que apenas uma versão da classe foi mantida se esse não tiver o método invocado, então eu estava obtendoNoSuchMethodError
exceção de tempo de execução, mas a compilação estava correta.Relacionado: https://reflectoring.io/nosuchmethod/
fonte
Encontrei um problema semelhante ao alterar assinaturas de método no meu aplicativo. A limpeza e reconstrução do meu projeto resolveu o "NoSuchMethodError".
fonte
A resposta acima explica muito bem .. apenas para adicionar uma coisa Se você estiver usando o eclipse, use ctrl + shift + T e insira a estrutura de pacotes da classe (por exemplo: gateway.smpp.PDUEventListener), você encontrará todos os jars / projetos onde está presente . Remova os jarros desnecessários do caminho de classe ou adicione acima no caminho da classe. Agora ele pegará o correto.
fonte
Eu tive um problema semelhante.
Finalmente, identifiquei que a causa raiz estava mudando o tipo de dados da variável.
Employee.java
-> Contém a variável (EmpId
) cujo Tipo de Dados foi alterado deint
paraString
.ReportGeneration.java
-> Recupera o valor usando o gettergetEmpId()
,.Devemos reorganizar o jar incluindo apenas as classes modificadas. Como não houve alteração,
ReportGeneration.java
eu estava apenas incluindo oEmployee.class
arquivo Jar. Eu tive que incluir oReportGeneration.class
arquivo no frasco para resolver o problema.fonte
Eu tive o mesmo problema. Isso também é causado quando há uma ambiguidade nas classes. Meu programa estava tentando chamar um método que estava presente em dois arquivos JAR presentes no mesmo caminho de local / classe. Exclua um arquivo JAR ou execute seu código para que apenas um arquivo JAR seja usado. Verifique se você não está usando o mesmo JAR ou versões diferentes do mesmo JAR que contêm a mesma classe.
fonte
Melhor explicação: https://www.journaldev.com/14538/java-lang-nosuchmethoderror
fonte
Também encontrei este erro.
Meu problema era que alterei a assinatura de um método, algo como
para dentro
Este método foi chamado de um contexto semelhante ao
O compilador ficou em silêncio em relação a avisos / erros, pois o capital é tanto moeda quanto euro.
O problema apareceu devido ao fato de eu compilar apenas a classe na qual o método foi definido - Bank, mas não a classe da qual o método está sendo chamado, que contém o método main ().
Esse problema não é algo que você pode encontrar com muita frequência, pois na maioria das vezes o projeto é reconstruído manualmente ou uma ação de compilação é acionada automaticamente, em vez de apenas compilar a classe modificada.
Meu caso de usuário foi que eu gerei um arquivo .jar que deveria ser usado como um hotfix, que não continha o App.class, pois isso não foi modificado. Fazia sentido não incluí-lo, pois mantinha a classe base do argumento inicial através da herança.
O problema é que, quando você compila uma classe, o bytecode resultante é meio estático , em outras palavras, é um referência rígida .
O bytecode desmontado original (gerado com a ferramenta javap) fica assim:
Depois que o ClassLoader carrega o novo Bank.class compilado, ele não encontra esse método, parece que ele foi removido e não foi alterado, portanto, o erro nomeado.
Espero que isto ajude.
fonte
O problema no meu caso era ter duas versões da mesma biblioteca no caminho da compilação. A versão mais antiga da biblioteca não tinha a função, e a mais recente.
fonte
Eu tive um problema semelhante com meu projeto Gradle usando Intelij. Eu o resolvi excluindo o pacote .gradle (veja a captura de tela abaixo) e reconstruindo o projeto. Pacote .gradle
fonte
NoSuchMethodError: Passei algumas horas corrigindo esse problema, finalmente o corrigi apenas renomeando o nome do pacote, limpo e compilado ... Tente a compilação limpa primeiro, se não funcionar, tente renomear o nome da classe ou o nome do pacote e a compilação limpa. . deve ser corrigido. Boa sorte.
fonte
Se o nome do seu arquivo for diferente do nome da classe que contém o método principal, é possível que esse erro possa causar.
fonte