我找不到Java 之间NoSuchMethodException和NoSuchMethodErrorJava 之间的确切区别.有人能给出解释和这两件事的例子吗?
yol*_*ole 24
当您通过反射调用方法时,可以抛出NoSuchMethodException,并且方法的名称来自程序中的变量.
当编译的Java类对另一个类执行常规方法调用并且该方法不存在时,可以抛出NoSuchMethodError.(这通常发生在调用者类是针对被调用的类的一个版本编译时,并且正在与该类的另一个版本一起执行,该类不再具有该方法.)
shi*_*ari 14
NoSuchMethodException尝试使用反射调用方法时发生.
NoSuchMethodError当您在编译时使用该方法但在运行时没有它时会发生.
请考虑以下示例 NoSuchMethodError
类:Person.java
public class Person{
public String getName(){
return "MyName";
}
}
Run Code Online (Sandbox Code Playgroud)
使用javac Person.java
And 编译它现在尝试使用它
来运行它
java Person
它会给你
java.lang.NoSuchMethodError: main
Exception in thread "main"
Run Code Online (Sandbox Code Playgroud)
因为它试图找到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);
}
Run Code Online (Sandbox Code Playgroud)
这是一个异常的说法
java.lang.NoSuchMethodException: java.lang.String.myMethod(null, null)
Run Code Online (Sandbox Code Playgroud)
考虑这个有更好解释的链接
NoSuchMethodException当你尝试获得一个不存在反射的方法时抛出.例如,通过Class#getDeclaredMethod(name, parameters)使用错误的名称或参数进行调用.
NoSuchMethodError当虚拟机找不到您尝试调用的方法时,抛出此异常.当您使用一个版本的库进行编译,然后在类路径上使用该库的另一个版本运行应用程序时(例如,没有您正在调用的方法的较旧版本),可能会发生这种情况.
当找不到特定方法时抛出。
如果应用程序尝试调用类(静态或实例)的指定方法,并且该类不再具有该方法的定义,则抛出该异常。
另请参阅这篇文章,它解释得更好。