我找不到JavaNoSuchMethodException
和NoSuchMethodError
Java之间的确切区别。有人可以解释这两件事吗?
4 回答
当您通过反射调用方法时,可能会抛出 NoSuchMethodException,并且方法的名称来自程序中的变量。
当已编译的 Java 类对另一个类执行常规方法调用并且该方法不存在时,可能会引发 NoSuchMethodError。(这通常发生在调用者类针对被调用类的一个版本编译时,并且正在与该类的另一个版本一起执行,该版本不再具有该方法。)
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
当虚拟机找不到您尝试调用的方法时抛出。当您使用一个版本的库编译,然后在类路径上使用另一个版本的库运行应用程序(例如,没有您正在调用的方法的旧版本)时,可能会发生这种情况