java.lang.NoSuchMethodError

2024 年 9 月 10 日 | 阅读 7 分钟

Java lang NoSuchMethodError 是一个运行时错误。当编译器找不到任何被调用的方法时,就会发生此错误。这是一个 Java 错误,当一个在编译时存在但在运行时不存在的方法被调用时就会发生。

换句话说,用户调用了一个在编译时存在但在运行时不存在的方法。这表明我们正在调用的方法在运行时不存在,从而导致 Java lang NoSuchMethodError。该方法可以是实例方法,也可以是静态方法。

Java 类 NoSuchMethodError 简介

作为开发者,我们经常与类及其关联方法进行交互。我们创建一个类并在类中创建一个方法。在 main 函数中,我们创建一个类对象,然后调用该对象上的方法。但是,我们可能需要在软件的后期删除此函数。当我们删除此方法但继续在 main 函数中调用它时,就会引发错误。正如您所料,这是一个 java.lang.NoSuchMethod 错误。

java.lang.NoSuchMethodError 确实是一个运行时错误,当应用程序尝试执行类中不存在的方法时发生。这个错误通常在编译过程中出现,但也可能在运行时出现。因此,任何用户调用了一个在编译时存在但在运行时不存在的方法,都会导致此错误。这表明我们正在调用的方法在运行时实际上不存在,从而导致 Java lang NoSuchMethodError。该方法可以是实例方法,也可以是静态方法。

Java lang NoSuchMethodError 可能由于多种原因而被抛出,例如代码已部分构建或类的描述已被不兼容地修改(这意味着类定义之前不同,但现在已被用户更改)。下一节将详细讨论几个因素。

错误层次结构

这里展示了 Java 中 NoSuchMethod 错误(NoSuchMethodError)的继承树。

因此,IncompatibleClassChangeError 和 LinkageError 都包含在 Java.lang.NoSuchMethodError 的继承树中。上述这些问题是由编译后进行的类不兼容修改引起的。

所有已实现的接口

在 Java 中,大多数已实现的接口确实是 Serializable 接口。它是 java.io 包的一部分。Serializable 确实是一种标记接口。标记接口中没有任何方法或字段。因此,实现它的类不需要实现任何方法。当类希望它们的实例被序列化或反序列化时,它们必须实现 Serializable 接口。

构造函数

下表列出了与 Java 类中 NoSuchMethodError 相关的构造函数。

构造函数描述
NoSuchMethodError()此方法创建一个没有描述性通知的 NoSuchMethodError。
NoSuchMethodError(String s)此方法创建一个带有描述性消息的 NoSuchMethodError。

Java 类 NoSuchMethodError 中的方法

Java 类 NoSuchMethodError 具有从 java.lang.Throwable 和 java.lang.Object 类继承的方法。我们将深入探讨从每个类继承的一些方法。

从 java.lang.Throwable 类继承的一些方法如下

方法描述
final void addSuppressed(Throwable exception)此函数用于将作为参数提供的给定异常附加到为了产生此表达式而抑制的异常。
Throwable getCause()此方法返回问题的根本原因,如果原因未知则返回 null。
Throwable fillInStackTrace()此方法填充执行堆栈跟踪。
String getMessage()该函数用于返回可抛出对象的描述性消息字符串。
String getLocalizedMessage()此函数用于生成可抛出对象的本地化描述。
void printStackTrace(PrintStream s)此方法将可抛出对象及其回溯信息打印到指定的打印流。
void setStackTrace(StackTraceElement[] stackTrace)该函数用于设置 getStackTrace() 返回并通过 printStackTrace() 和相关方法显示的堆栈跟踪元素。
String toString()它用于返回可抛出对象的描述。

从 java.lang.Object 类继承的一些方法如下

方法描述
toString()此函数用于返回对象的字符串表示。它用于将 Object 转换为 String。
hashCode()此函数返回其哈希码值。
equals (Object obj)此函数比较两个对象,如果它们相等则返回 true 或 false。它将调用该方法的对象的值与所提供参数对象的值进行比较。
getClass()此方法用于返回对象的类对象。它还获取调用方法的对象的运行时类。
clone()为了生成该对象的精确副本,我们使用了 clone() 方法。这会创建一个新对象并将该对象的所有数据复制到其中。
notify()此 notify() 方法会唤醒正在等待该对象的唯一线程,该线程随后开始执行。
notifyAll()此 notifyAll() 方法用于开始唤醒此对象上所有等待的线程。此函数向对象的每个等待线程发送通知。
wait()wait() 方法指示当前线程释放锁并进入睡眠状态。

构造函数

  • NoSuchMethodError(): 此技术创建一个没有描述性通知的 NoSuchMethodError。
  • NoSuchMethodError(String s): 此方法创建一个带有描述性消息的 NoSuchMethodError。在这种情况下,'s' 是详细消息。

Java 类 NoSuchMethodError 的原因是什么?

当抛出 Java Class NoSuchMethodError 异常时,这表明应用程序在运行时未识别该方法。如果代码已部分重新编译,则可能发生此问题。其他因素包括:

第三方库的重大更改

当我们的软件使用第三方库中的某个方法,该方法在构建时存在但在运行时不存在时,就会发生此 java.lang.NoSuchMethodError 错误。这意味着正在调用的方法已被第三方库删除。

上述情况表明存在构建问题,因为该方法在编译时存在但在运行时不存在。很可能是用于构建的库版本与软件的版本不同。

覆盖第三方库版本

当软件中使用第三方库时,可能会导致 Java lang NoSuchMethodError。例如,该版本可能是其他第三方库的依赖项,而这些库使用该库的不同版本。通过使用 Maven 或 Apache 等技术可以避免版本冲突。

如何解决 NoSuchMethodError

您为解决 Java.lang. NoSuchMethodError 而采取的步骤如下:

进行完全清理和编译

要解决此 NoSuchMethodError,请执行完全清理,然后重新编译包含被调用类和调用类的项目。这确保使用了类中的最新版本。

修复第三方库版本问题

如果问题是由于使用第三方库方法引起的,我们可以通过确定该库是否包含被调用的类和方法来解决该问题。

通过使用 -verbose:class,用户可以获得有关加载类的库的信息。

Java 类 NoSuchMethodError 的示例

在此程序中,我们将看一个改变游戏规则的修改示例。我们声明两个类,第一个是带有方法的辅助类。然后我们将定义我们的 Main 类并在 Main 类中创建辅助类的对象。我们将调用一个方法,该方法在刚创建的对象上,而该对象不属于辅助类。这将导致 NoSuchMethodError。

文件名: NoSuchMethodError.java

输出

public class Main {
       ^
/tmp/ghTvaEUC9E/NoSuchMethodError.java:14: error: cannot find symbol
        A.print("Java");
^
  symbol:   method print(String)
  location: variable A of type NoSuchMethodError
2 errors

根据上面的示例,我们创建了一个类 NoSuchMethodError 并在其中定义了一个方法。现在我们将构建 main 函数并用该类的一个对象填充它。然后我们将调用一个方法,该方法在刚创建的对象上,而该对象不属于辅助类。输出将是 NoSuchMethodError。

文件名: NoSuchMethodError.java

输出

String obtained is Java

在下面的代码中,我们遵循了与上一个示例相同的过程。唯一的变化是我们调用类定义中定义的方法。这将解决 NoSuchMethodError 并产生预期的结果。

NoSuchMethodException 与 NoSuchMethodError

我们都熟悉 NoSuchMethodError,它发生在编译后的 Java 类对另一个类进行典型方法调用但该方法不存在时。调用方法并通过反射,并且方法名称是从应用程序中的变量派生的,则可能生成 NoSuchMethodException。

结论

  • java.lang.NoSuchMethodError 确实是一个在运行时发生的错误。当编译器找不到被调用的方法时,就会发生此错误。这是一个 Java 错误,当一个在编译时存在但在运行时不存在的方法被调用时就会发生。
  • java.lang.NoSuchMethodError 可能由于多种原因而被引发,包括代码仅部分构建或类定义已被不兼容地修改。
  • 在 Java 中,所有已实现的接口都是 Serializable 接口。它是 java.io 包的一部分。
  • 要解决 NoSuchMethodError,请执行完全清理,然后重新编译包含被调用类和调用类的项目。还可以通过第三方库版本解决问题。