16

我找不到JavaNoSuchMethodExceptionNoSuchMethodErrorJava之间的确切区别。有人可以解释这两件事吗?

4

4 回答 4

26

当您通过反射调用方法时,可能会抛出 NoSuchMethodException,并且方法的名称来自程序中的变量。

当已编译的 Java 类对另一个类执行常规方法调用并且该方法不存在时,可能会引发 NoSuchMethodError。(这通常发生在调用者类针对被调用类的一个版本编译时,并且正在与该类的另一个版本一起执行,该版本不再具有该方法。)

于 2015-01-14T08:46:10.003 回答
14

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)

考虑这个有更好解释的链接

于 2015-01-14T08:47:01.307 回答
6

NoSuchMethodException当您尝试获取反射不存在的方法时抛出。例如,Class#getDeclaredMethod(name, parameters)使用错误的名称或参数调用。

NoSuchMethodError虚拟机找不到您尝试调用的方法时抛出。当您使用一个版本的库编译,然后在类路径上使用另一个版本的库运行应用程序(例如,没有您正在调用的方法的旧版本)时,可能会发生这种情况

于 2015-01-14T08:55:42.543 回答
2

Class NoSuchMethodException

当找不到特定方法时抛出。

Class NoSuchMethodError

如果应用程序尝试调用类的指定方法(静态或实例),并且该类不再具有该方法的定义,则抛出该异常。

另见这篇文章,它解释得更好。

于 2015-01-14T08:45:03.890 回答