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

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

Ответы [ 27 ]

2 голосов
/ 20 сентября 2018

Просто добавление к существующим ответам. Я столкнулся с этой проблемой с котом в затмении. Я изменил один класс и сделал следующие шаги,

  1. Очистили и построили проект в eclpise

  2. mvn clean install

  3. Перезапущенный кот

Тем не менее я столкнулся с той же ошибкой. Затем Я очистил tomcat, очистил рабочий каталог tomcat и перезапустил сервер, и моя проблема исчезла. Надеюсь, это кому-нибудь поможет

2 голосов
/ 24 апреля 2018

Попробуйте следующим образом: удалите все файлы .class из каталогов вашего проекта (и, конечно, все подкаталоги). Перестроить.

Иногда mvn clean (если вы используете maven) не очищает файлы .class, созданные вручную javac. И эти старые файлы содержат старые подписи, ведущие к NoSuchMethodError.

2 голосов
/ 08 сентября 2017

Я только что решил эту ошибку, перезапустив Eclipse и запустив приложение. Причиной моего дела может быть то, что я заменяю свои исходные файлы, не закрывая свой проект или Eclipse. Это вызвало разные версии классов, которые я использовал.

2 голосов
/ 22 августа 2017

Для меня это произошло потому, что я изменил тип аргумента в функции с Object a на String a. Я мог бы решить это с чистой и построить снова

1 голос
/ 28 мая 2018

Я исправил эту проблему в Eclipse, переименовав тестовый файл Junit.
В моем рабочем пространстве Eclipse у меня есть проект App и проект Test.
Тестовый проект имеет проект App как необходимый проект на пути сборки.

Начал получать ошибку NoSuchMethodError.
Затем я понял, что класс в проекте Test имеет то же имя, что и класс в проекте App.

App/  
  src/
     com.example/  
       Projection.java
Test/  
  src/
     com.example/
       Projection.java

После переименования теста в правильное имя ProjectionTest.java исключение исчезло.

0 голосов
/ 08 ноября 2018

У меня была похожая проблема с моим Gradle Project, использующим Intelij. Я решил это, удалив пакет .gradle (см. Скриншот ниже) и перестроив проект. . Gradle Package

0 голосов
/ 20 сентября 2018

Проблема в моем случае заключалась в наличии двух версий одной и той же библиотеки в пути сборки. В старой версии библиотеки не было этой функции, а в более новой.

0 голосов
/ 04 мая 2018

Я тоже сталкивался с этой ошибкой.

Моя проблема заключалась в том, что я изменил сигнатуру метода, что-то вроде

void invest(Currency money){...}

в

void invest(Euro money){...}

Этот метод был вызван из контекста, подобного

public static void main(String args[]) {
    Bank myBank = new Bank();

    Euro capital = new Euro();
    myBank.invest(capital);
}

Компилятор молчал в отношении предупреждений / ошибок, поскольку капитал - это как валюта, так и евро.

Проблема возникла из-за того, что я скомпилировал только класс, в котором был определен метод - Bank, но не класс, из которого вызывается метод, который содержит метод main ().

С этой проблемой вы можете столкнуться не слишком часто, поскольку чаще всего проект перестраивается вручную или автоматически запускается действие Build, а не просто компилируется один измененный класс.

Мой вариант использования состоял в том, что я сгенерировал файл .jar, который должен был использоваться в качестве исправления, который не содержал класс App.class, поскольку он не был изменен. Для меня имело смысл не включать его, так как я сохранил базовый класс через наследование исходного аргумента.

Дело в том, что при компиляции класса результирующий байт-код имеет вид static , другими словами, это hard-reference .

Исходный дизассемблированный байт-код (созданный с помощью инструмента javap) выглядит следующим образом:

 #7 = Methodref          #2.#22         // Bank.invest:(LCurrency;)V

После того, как ClassLoader загрузит новый скомпилированный Bank.class, он не найдет такой метод, он выглядит так, как если бы он был удален и не изменен, и, следовательно, названная ошибка.

Надеюсь, это поможет.

0 голосов
/ 11 октября 2017

Я столкнулся с подобной проблемой.

Caused by: java.lang.NoSuchMethodError: com.abc.Employee.getEmpId()I

Наконец, я определил причину изменения типа данных переменной.

  1. Employee.java -> Содержит переменную (EmpId), тип данных которой был изменен с int на String.
  2. ReportGeneration.java -> Извлекает значение, используя геттер, getEmpId().

Мы должны восстановить банку, включив только модифицированные классы. Поскольку не было никаких изменений в ReportGeneration.java, я включил только Employee.class в файл Jar. Мне пришлось включить файл ReportGeneration.class в банку, чтобы решить эту проблему.

0 голосов
/ 19 ноября 2016

Приведенный выше ответ очень хорошо объясняет. Просто добавить одну вещь Если вы используете eclipse, используйте ctrl + shift + T и введите структуру пакета класса (например, gateway.smpp.PDUEventListener), вы найдете все jar / проекты, в которых он присутствует. Удалите ненужные фляги из пути к классам или добавьте выше в пути к классам. Теперь он подберет правильный.

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