Разница между NoSuchMethodException и NoSuchMethodError в Java

Я не могу найти точную разницу между NoSuchMethodException а также NoSuchMethodError на Яве. Может ли кто-нибудь дать объяснение и пример этих двух вещей?

4 ответа

NoSuchMethodException может быть вызвано, когда вы вызываете метод через отражение, и имя метода происходит от переменной в вашей программе.

NoSuchMethodError может быть сгенерирован, когда скомпилированный класс Java выполняет обычный вызов метода для другого класса, а метод не существует. (Это обычно происходит, когда класс вызывающей стороны был скомпилирован для одной версии вызываемого класса и выполняется вместе с другой версией этого класса, который больше не имеет метода.)

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

Рассмотрим следующий пример для NoSuchMethodError

Класс: Person.java

public class Person{
      public String getName(){
         return "MyName";
     }
}

Скомпилируйте его, используяjavac Person.javaА теперь попробуйте запустить это с помощью java Person

Это даст вам

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

Потому что он пытается найти public static void main(String [] args) чего там нет

За NoSuchMethodException

c = Class.forName("java.lang.String");
  try
  {
    Class[] paramTypes = new Class[2];
    Method m = c.getDeclaredMethod("myMethod", paramTypes);
  }

это будет исключение поговорка

java.lang.NoSuchMethodException: java.lang.String.myMethod(null, null)

Рассмотрим эту ссылку, которая имеет лучшее объяснение

NoSuchMethodException бросается, когда вы пытаетесь получить метод, который не существует с отражением. Например, позвонив Class#getDeclaredMethod(name, parameters) либо с неправильным именем или параметрами.

NoSuchMethodError генерируется, когда виртуальная машина не может найти метод, который вы пытаетесь вызвать. Это может произойти, когда вы компилируете одну версию библиотеки, а затем запускаете приложение с другой версией библиотеки в пути к классам (например, более старая версия, в которой отсутствует вызываемый вами метод)

Class NoSuchMethodException:

Брошенный, когда определенный метод не может быть найден.

Class NoSuchMethodError

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

Также см. Эту статью, это объясняет это лучше.

Другие вопросы по тегам