Java中NoSuchMethodException和NoSuchMethodError之间的区别

Bal*_*ani 14 java throwable

我找不到Java 之间NoSuchMethodExceptionNoSuchMethodErrorJava 之间的确切区别.有人能给出解释和这两件事的例子吗?

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)

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


Ein*_*rve 5

NoSuchMethodException当你尝试获得一个不存在反射的方法时抛出.例如,通过Class#getDeclaredMethod(name, parameters)使用错误的名称或参数进行调用.

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


Mar*_*oun 2

Class NoSuchMethodException:

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

Class NoSuchMethodError

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

另请参阅这篇文章,它解释得更好。

  • 这意味着调用类不知道已更改的类。当调用类被编译时,该方法就在那里,但在运行时 - 有些东西发生了变化,它再也找不到它了 (4认同)
  • @Balasubramani你有一个方法A.method1()调用B.method2(),你删除B.method2()而不重新编译类A。当A.method1()运行时你会得到一个NoSuchMethodError (4认同)