Как получить java.lang.NoSuchMethodError - PullRequest
4 голосов
/ 23 июля 2011

Введение:

Есть много вопросов, как Как исправить 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 .

Ответы [ 2 ]

12 голосов
/ 23 июля 2011

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

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

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

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

  • Вы используете стороннюю библиотеку (банку), которая зависит от другой банки. Однако у вас несовместимые версии этих jar-файлов, и первый пытается вызвать метод класса во втором баночка, которой больше нет / пока.
  • Ваши пути к классам во время компиляции и во время выполнения различаются - вы скомпилировали свой код для версии какой-либо библиотеки (которая также может быть самой JDK), но ваша среда выполнения имеет другие версии
  • У вас есть многомодульный проект. Ваша IDE "связывает" проект во время компиляции, поэтому любые изменения видны сразу. Но при сборке вы забудете скомпилировать один из модулей (в который вы добавили метод), поэтому во время выполнения он использует старую версию.
2 голосов
/ 23 июля 2011

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

Попытка выполнить этот класс с использованием некоторой версии Java <1.6.xxxx </p>

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

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

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