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