Как получить java.lang.NoSuchMethodError

Введение:

Есть много вопросов, таких как Как исправить java.lang.NoSuchMethodError в SO.

Как я вижу, самый простой способ получить эту ошибку — создать класс

class MyClass {} // no methods at all, for instance

без правильно определенного основного метода, скомпилируйте его и запустите :

java MyClass

Возникает исключение:

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

Но этот пример слишком простой.

Вопрос:

Может ли кто-нибудь предоставить простой код, который

  1. Состоит из двух, максимум трех занятий (если вы можете показать, что занятий нужно больше - то милости просим);
  2. Содержит правильно определенный основной метод;
  3. Запуск класса с этим основным методом приводит в исключение с java.lang.NoSuchMethodError.

person MockerTim    schedule 23.07.2011    source источник
comment
Я не уверен. Это спорно, но обычно я удаляю теги, которые используются менее 30 раз (и не являются какой-то новой технологией), поэтому никто никогда не захочет искать вопросы, отмеченные этим тегом.   -  person Bozho    schedule 23.07.2011


Ответы (2)


NoSuchMethodError происходит, если один класс ожидает метод в другой класс (и был скомпилирован с этим методом), но во время выполнения другой класс не имеет этого метода. Итак, вам необходимо:

  • создать два класса, один из которых вызывает метод другого
  • скомпилировать два класса
  • затем удалите вызванный метод из 2-го класса и скомпилируйте только 2-й класс

Затем, если вы запустите первый класс (с основным методом), он выдаст эту ошибку при попытке вызвать метод во втором классе (метод больше не существует)

Однако этот пример редко встречается в реальном мире. Вот несколько реальных случаев, когда возникает ошибка:

  • Вы используете стороннюю библиотеку (jar), которая зависит от другого jar. Однако у вас есть несовместимые версии этих банок, и первая пытается вызвать метод для класса во второй банке, которого больше/пока не существует.
  • Ваши пути к классам во время компиляции и во время выполнения различаются — вы скомпилировали свой код с версией некоторой библиотеки (которая также может быть самой JDK), но ваша среда выполнения имеет другие версии
  • У вас многомодульный проект. Ваша IDE «связывает» проект во время компиляции, поэтому любые изменения видны сразу. Но при сборке вы забываете скомпилировать один из модулей (где вы добавили метод), поэтому во время выполнения используется старая версия.
person Bozho    schedule 23.07.2011

Создайте файл класса из класса, который вызывает java.util.Properties.load(Reader) в своем основном методе с некоторой версией Java >= 1.6.xxxx.

Попытайтесь выполнить этот класс, используя какую-либо версию Java ‹ 1.6.xxxx.

Причина: java.util.Properties.load(Reader) появился в Java 6. Он вызывается, но не существует в этой версии Java.

Это относится ко всем методам, введенным в языковые библиотеки по умолчанию в обновлениях.

person Zéychin    schedule 23.07.2011
comment
То же самое будет работать с использованием метода String.isEmpty(). Это выглядит настолько просто, что должно было быть там всегда, но на самом деле было представлено только в Java 1.6. - person Wolfgang; 23.07.2011