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

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

Ответ 1

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

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

Ответ 2

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)

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

Ответ 3

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

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

Ответ 4

Class NoSuchMethodException:

Брошено, когда конкретный метод не найден.

Class NoSuchMethodError

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

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