如何获取 java.lang.NoSuchMethodError

发布于 2024-11-25 23:55:02 字数 1042 浏览 1 评论 0原文

简介:

SO 上有很多问题,如 How to fix java.lang.NoSuchMethodError

正如我所看到的,出现此错误的最简单方法是创建一个

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

没有正确定义的类 主要方法, 编译并运行:

java MyClass

出现异常:

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

但是这个例子太简单了。

问题:

任何人都可以提供一个简单的代码,它

  1. 由两个,最多三个类组成(如果你可以表明需要更多课程 - 那么不客气);
  2. 包含正确定义的main方法
  3. 使用 main 方法 运行该类,导致异常为java.lang.NoSuchMethodError

Introduction:

There are many questions as How to fix java.lang.NoSuchMethodError on SO.

As I can see, the simplest way to get this error, is to make a class

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

without properly defined main method,
compile it and run:

java MyClass

Exception emerges:

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

But this example is too simple.

The question:

Could anyone provide a simple code, which

  1. Consists of two, maximum three classes (if you can show that more classes are needed - then you are welcome);
  2. Contains properly defined main method;
  3. Running of the class with that main method, leads to exception with java.lang.NoSuchMethodError.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

放低过去 2024-12-02 23:55:02

NoSuchMethodError 发生如果一个类需要另一个类中的方法(并且使用该方法进行编译),但在运行时另一个类没有该方法。因此,您需要:

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

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

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

  • 您正在使用依赖于另一个 jar 的第 3 方库 (jar)。但是,这些 jar 的版本不兼容,第一个尝试调用第二个类中的方法
    不再存在的 jar。
  • 您的编译时和运行时类路径不同 - 您已经针对某个库的版本(也可以是 JDK 本身)编译了代码,但您的运行时具有其他版本
  • 您有一个多模块项目。您的 IDE 在编译时“链接”项目,因此任何更改都会立即可见。但是,当您构建时,您忘记编译其中一个模块(您在其中添加了一个方法),因此在运行时它使用的是旧版本。

NoSuchMethodError happens if one class expects a method in another class (and was compiled with that method in place), but at runtime the other class does not have that method. So you need to:

  • create two classes, one of which calls a method on the other
  • compile the two classes
  • then remove the invoked method from the 2nd class, and compile the 2nd class only

Then, if you run the first class (with main method), it will throw that error when trying to call the method on the 2nd class (the method no longer exists)

This example would rarely happen in the real world though. Here are some real cases when the error occurs:

  • You are using a 3rd party library (jar) that depends on another jar. However you are having incompatible versions of those jars, and the 1st one tries to invoke a method on a class in the 2nd
    jar that does not exist anymore/yet.
  • Your compile-time and runtime classpaths differ - you have compiled your code against a version of some library (that can also be the JDK itself), but your runtime is having other versions
  • You have a multi-module project. Your IDE "links" the project at compile-time, so any changes is seen immediately. But when you build you forget to compile one of the modules (where you have added a method), so at runtime it is using the old version.
二货你真萌 2024-12-02 23:55:02

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

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

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

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

Create a class file from a class which calls java.util.Properties.load(Reader) in its main method with some Java version >= 1.6.xxxx.

Attempt to execute this class using some Java version < 1.6.xxxx

Reason: java.util.Properties.load(Reader) was introduced in Java 6. It is being called, but does not exist in this version of Java.

This applies similarly to all methods introduced to the default language libraries in updates.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文