4

介绍:

有很多问题,例如如何在 SO 上修复 java.lang.NoSuchMethodError。

如我所见,获得此错误的最简单方法是创建一个类

class MyClass {} // no methods at all, for instance

没有正确定义的main 方法,编译它并运行:

java MyClass

出现异常:

Exception in thread "main" java.lang.NoSuchMethodError: main

但是这个例子太简单了。

问题:

谁能提供一个简单的代码,

  1. 由两门课程组成,最多三门课程(如果您能证明需要更多课程 - 那么欢迎您);
  2. 包含正确定义的主要方法
  3. 使用该main 方法运行该类会导致java.lang.NoSuchMethodError异常。
4

2 回答 2

13

NoSuchMethodError如果一个类期望另一个类中的方法(并且使用该方法编译),但在运行时另一个类没有该方法,则会发生这种情况。所以你需要:

  • 创建两个类,其中一个调用另一个方法
  • 编译这两个类
  • 然后从第二个类中删除调用的方法,并只编译第二个类

然后,如果您运行第一个类(使用 main 方法),它会在尝试调用第二个类的方法时抛出该错误(该方法不再存在)

这个例子在现实世界中很少发生。以下是发生错误时的一些真实案例:

  • 您正在使用依赖于另一个 jar 的 3rd 方库 (jar)。但是,您拥有这些 jar 的不兼容版本,并且第一个尝试调用第二个 jar 中不再存在/尚​​不存在的类的方法。
  • 您的编译时和运行时类路径不同 - 您已针对某个库的版本(也可以是 JDK 本身)编译代码,但您的运行时有其他版本
  • 您有一个多模块项目。您的 IDE 在编译时“链接”项目,因此可以立即看到任何更改。但是,当您构建时,您忘记编译其中一个模块(您在其中添加了一个方法),因此在运行时它使用的是旧版本。
于 2011-07-23T06:47:30.937 回答
2

从一个类中创建一个类文件,该类java.util.Properties.load(Reader)在其 main 方法中调用一些 Java 版本 >= 1.6.xxxx。

尝试使用一些 Java 版本 < 1.6.xxxx 执行此类

原因:java.util.Properties.load(Reader)在 Java 6 中引入。它正在被调用,但在这个版本的 Java 中不存在。

这同样适用于在更新中引入默认语言库的所有方法。

于 2011-07-23T06:55:51.590 回答