Как исправить ошибку NoSuchMethodError? - PullRequest
146 голосов
/ 30 августа 2008

Я получаю ошибку NoSuchMethodError при запуске моей Java-программы. Что не так и как мне это исправить?

Ответы [ 27 ]

202 голосов
/ 30 августа 2008

Без дополнительной информации трудно точно определить проблему, но основная причина заключается в том, что вы, скорее всего, скомпилировали класс для другой версии класса, в которой отсутствует метод, чем той, которую вы используете при запуске .

Посмотрите на трассировку стека ... Если исключение появляется при вызове метода для объекта в библиотеке, вы, скорее всего, используете отдельные версии библиотеки при компиляции и запуске. Убедитесь, что у вас правильная версия в обоих местах.

Если исключение появляется при вызове метода для объектов, созданных классами , которые вы сделали, тогда ваш процесс сборки кажется неисправным. Убедитесь, что файлы классов, которые вы фактически используете, обновляются при компиляции.

107 голосов
/ 06 июня 2010

У меня была ваша проблема, и вот как я ее исправил. Следующие шаги являются рабочим способом добавления библиотеки. Первые два шага я сделал правильно, но последний шаг я не выполнил, перетаскивая файл «.jar» прямо из файловой системы в папку «lib» в моем проекте eclipse. Кроме того, мне пришлось удалить предыдущую версию библиотеки как из пути сборки, так и из папки "lib".

Шаг 1 - Добавить .jar для построения пути

enter image description here

Шаг 2 - Связать источники и javadocs (необязательно)

enter image description here

Шаг 3 - На самом деле перетащите файл .jar в папку «lib» (не обязательно)

enter image description here

65 голосов
/ 31 августа 2008

Обратите внимание, что в случае отражения вы получите NoSuchMethodException, а с неотражающим кодом вы получите NoSuchMethodError. Я склонен искать в очень разных местах, когда сталкиваюсь с одним против другого.

44 голосов
/ 03 сентября 2008

Если у вас есть доступ к изменению параметров JVM, добавление подробного вывода должно позволить вам видеть, какие классы загружаются из каких JAR-файлов.

java -verbose:class <other args>

Когда ваша программа запущена, JVM должна вывести на стандартную информацию, такую ​​как:

...

[Загружен junit.framework.Assert из файла: / C: /Program%20Files/junit3.8.2/junit.jar]

...

11 голосов
/ 30 августа 2008

Это обычно вызывается при использовании системы сборки, такой как Apache Ant , которая компилирует java-файлы, только когда java-файл новее, чем файл класса. Если сигнатура метода изменяется и классы используют старую версию, вещи могут быть скомпилированы неправильно. Обычное исправление - полная перестройка (обычно "ant clean", затем "ant").

Иногда это также может быть вызвано при компиляции с одной версией библиотеки, но с другой версией.

5 голосов
/ 08 октября 2015

Если вы используете Maven или другую платформу, и вы получаете эту ошибку почти случайно, попробуйте чистую установку, например ...

clean install

Это особенно вероятно, если вы написали объект и знаете, что у него есть метод. Работал на меня.

4 голосов
/ 30 августа 2008

Это также может быть результатом использования отражения. Если у вас есть код, который отражает класс и извлекает метод по имени (например, с помощью Class.getDeclaredMethod("someMethodName", .....)), то каждый раз, когда меняется имя метода, например, во время рефакторинга, вам нужно будет помнить об обновлении параметров для метода отражения чтобы соответствовать новой сигнатуре метода, или вызов getDeclaredMethod вызовет NoSuchMethodException.

Если это причина, то трассировка стека должна показывать точку, в которой вызывается метод отражения, и вам просто нужно обновить параметры, чтобы они соответствовали фактической сигнатуре метода.

По моему опыту, это иногда возникает при модульном тестировании частных методов / полей и использовании класса TestUtilities для извлечения полей для проверки теста. (Как правило, с устаревшим кодом, который не был разработан с учетом модульного тестирования.)

3 голосов
/ 02 сентября 2008

Если вы пишете веб-приложение, убедитесь, что у вас нет конфликтующих версий jar-файла в каталоге глобальной библиотеки вашего контейнера, а также в вашем приложении. Вы можете не обязательно знать, какая банка используется загрузчиком классов.

например.

  • кот / общий / Lib
  • mywebapp / WEB-INF / Lib
2 голосов
/ 04 ноября 2016

Это означает, что соответствующий метод отсутствует в классе:

  1. Если вы используете jar, декомпилируйте и проверьте, имеет ли соответствующая версия jar соответствующий класс.
  2. Проверьте, правильно ли вы скомпилировали класс из вашего источника.
2 голосов
/ 16 июля 2015

Эти проблемы вызваны использованием одного и того же объекта в тех же двух классах. Используемые объекты не содержат новый метод. Добавлен новый класс объектов.

например:

filenotnull=/DayMoreConfig.conf
16-07-2015 05:02:10:ussdgw-1: Open TCP/IP connection to SMSC: 10.149.96.66 at 2775
16-07-2015 05:02:10:ussdgw-1: Bind request: (bindreq: (pdu: 0 9 0 [1]) 900 900 GEN 52 (addrrang: 0 0 2000) ) 
Exception in thread "main" java.lang.NoSuchMethodError: gateway.smpp.PDUEventListener.<init>(Lgateway/smpp/USSDClient;)V
        at gateway.smpp.USSDClient.bind(USSDClient.java:139)
        at gateway.USSDGW.initSmppConnection(USSDGW.java:274)
        at gateway.USSDGW.<init>(USSDGW.java:184)
        at com.vinaphone.app.ttn.USSDDayMore.main(USSDDayMore.java:40)

-bash-3.00$ 

Эти проблемы вызваны сопутствующим классом 02 (1 в src, 1 в файле jar - gateway.jar)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...