Я не могу найти точную разницу между 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
Брошено, когда конкретный метод не найден.
Брошено, если приложение пытается вызвать указанный метод класса (либо статический, либо экземпляр), и этот класс больше не имеет определения этого метода.
Также см. статью , она объясняет это лучше.