java.lang.NoSuchMethodError类介绍
Java lang NoSuchMethodError是一个运行时错误。当编译器无法找到任何被调用的方法时,该错误就会发生。这是一个Java错误,当一个在编译时存在的方法在运行时不存在时就会发生。
换句话说,用户调用了一个在编译时存在但在运行时不存在的方法。这意味着我们正在调用的方法在运行时并不存在,从而导致Java lang NoSuchMethodError。该方法可以是一个实例,也可以是一个静态方法。
Java类NoSuchMethodError简介
作为开发者,我们经常与类和相关方法互动。我们开发一个类和类里面的一个方法。在main函数中,我们构造一个类对象,然后在此基础上调用方法。然而,在我们的软件中,我们以后可能要删除这个函数。每当我们删除这个方法但继续在你的主函数中调用它时,就会产生一个错误。这是一个java.lang.NoSuchMethod错误,正如你所怀疑的那样。
java.lang.NoSuchMethodError确实是一个运行时错误,每当应用程序试图执行一个在类中不存在的方法时就会发生。该错误通常在编译过程中出现,但也可能在运行时发现。就这样,任何用户调用一个在编译时存在但在运行时不存在的方法,导致这个错误。它标志着我们所调用的方法在运行时并不真正存在,导致了Java lang NoSuchMethodError。该方法可以是一个实例,也可以是一个静态方法。
抛出Java lang NoSuchMethodError的原因有很多,例如,当代码被部分构建或类的描述被不兼容地修改时(这意味着早期的类定义是不同的,但现在它被用户改变了)。几个因素将在下一节详细研究。
错误层次结构
这里说明了Java中NoSuchMethod错误的继承树。
java.lang.Object
java.lang.Throwable
java.lang.Error
java.lang.LinkageError
java.lang.IncompatibleClassChangeError
java.lang.NoSuchMethodError
因此,IncompatibleClassChangeError和LinkageError被包含在Java.lang.NoSuchMethodError继承树中。上面列出的这些问题是由编译后对类的不兼容修改造成的。
所有已实现的接口
在Java中,大多数实现的接口确实是Serializable接口。它是java.io包的一部分。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( ) | 该方法返回问题的任何原因,如果原因不明则返回空。 |
Throwable fillInStackTrace() | 该方法填入执行堆栈跟踪。 |
String getMessage( ) | 该函数被用来返回throwable的描述性消息字符串。 |
String getLocalizedMessage( ) | 这个函数被用来生成一个可抛物的本地化描述。 |
void printStackTrace(PrintStream s) | 该方法返回throwable以及它对指定打印流的回溯。 |
void setStackTrace(StackTraceElement[] stackTrace) | 该函数用于设置由getStackTrace()返回并由printStackTrace()和相关方法显示的堆栈跟踪项目。 |
String toString( ) | 用来返回可抛物的描述。 |
从java.lang.Object类继承的一些方法列举如下
方法 | 描述 |
---|---|
toString() | 该函数用于返回一个对象的字符串表示。它被用来将一个对象变成一个字符串。 |
hashCode() | 该函数返回其哈希代码值。 |
equals (Object obj) | 这个函数对两个对象进行比较,当它们相等时返回真或假。它将调用该方法的对象的值与作为参数提供的对象的值进行比较。 |
getClass() | 这个方法被用来返回对象的类对象。这也获得了调用该方法的对象的运行时类。 |
clone() | 为了生成这个对象的一个相同的副本,我们使用clone()方法。这将创建一个新的对象,并将这个对象的所有数据复制到它身上。 |
notify() | 这个notify()方法唤醒了唯一会在该对象上等待的线程,同时该线程也开始执行。 |
notifyAll() | 这个notifyAll()方法被用来开始唤醒这个对象上所有等待的线程。这个函数向一个对象的每个等待线程发送通知。 |
wait() | wait()方法指示现有线程释放锁和睡眠。 |
构造函数
- NoSuchMethodError(): 该方法生成一个NoSuchMethodError,没有描述性的通知。
- NoSuchMethodError(String s): 该方法生成一个有描述性信息的NoSuchMethodError。’s’是本例中的详细信息。
Java类NoSuchMethodError的原因是什么
每当Java类NoSuchMethodError异常发出时,这表明应用程序在运行时没有识别该方法。如果你的代码被部分地重新编译,就可能出现这个问题。其他因素涉及。
第三方库中的破坏性变化
每当我们的软件使用第三方库里面的一个方法,而这个方法在构建时已经存在,但在运行时没有,就会出现这种java.lang错误。NoSuchMethodError。这意味着现在被调用的方法已经被第三方库删除。
上述情况表明是构建问题,因为该方法在编译时存在,但在运行时不存在。这有可能是在构建时利用的库的版本与软件的版本不同。
重写第三方库的版本
每当软件中使用第三方库时,它可能会产生Java lang NoSuchMethodError。例如,该版本可能是对其他一些第三方库的依赖,而这些第三方库使用的是这种库的不同版本。版本冲突可以通过利用Maven或Apache等技术来避免。
如何解决NoSuchMethodError问题
你所采取的行动是解决Java.lang.NoSuchMethodError的语法如下。
要进行全面清理和编译。
为了解决这个NoSuchMethodError,要进行一次全面的清理,之后重新编译包含被调用和调用类的项目。这可以确保利用最新版本的类。
修复第三方库的版本问题
如果问题的发生是由于使用了第三方库的方法,我们可以通过确定库是否包括被调用的类和方法来解决这个问题。
通过使用-verbose:class,用户可以获得库的信息来加载类。
关于Java类NoSuchMethodError的例子
在这个程序中,我们将看一个改变游戏规则的例子。我们声明两个类,其中第一个是带有方法的帮助类。然后我们将定义我们的主类,并在主类内构造辅助类的对象。我们将在新形成的对象上调用一个方法,这个对象不属于辅助类。这将导致一个NoSuchMethodError。
文件名: NoSuchMethodError.java
import java.io.*;
class NoSuchMethodError {
public void display(String s){
System.out.println("String obtained is " +s);
}
}
public class Main {
public static void main(String[] args){
NoSuchMethodError A = new NoSuchMethodError();
A.print("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类,并在其中定义了一个方法。现在我们将建立主函数,并从这样一个类中填充一个对象。然后我们将在这个新形成的对象上调用一个不属于帮助类的方法。这将导致输出中出现NoSuchMethodError。
文件名: NoSuchMethodError.java
import java.io.*;
class NoSuchMethodError {
public void display(String s){
System.out.println("String obtained is " +s);
}
}
public class Main {
public static void main(String[] args){
NoSuchMethodError A = new NoSuchMethodError();
A.display("Java");
}
}
输出 。
String obtained is Java
在下面的代码中,我们沿用了与前面的例子相同的过程。唯一不同的是,我们正在调用类描述中定义的方法。这个将解决NoSuchMethodError并产生预期的结果。
NoSuchMethodException vs NoSuchMethodError
我们都熟悉NoSuchMethodError,每当一个编译过的Java类对另一个类进行典型的方法调用,而该方法并不存在时,就会发生这种情况。NoSuchMethodException可能是在通过反射调用一个方法时产生的,也可能是方法名称来自于你的应用程序中的一个变量。
结论
- java.lang.NoSuchMethodError确实是一个在运行时发生的错误。当编译器无法找到被调用的方法时,就会发生这个错误。这是一个Java错误,当一个在编译时存在的方法在运行时不存在时就会发生。
- java.lang.NoSuchMethodError的产生有多种原因,包括诸如代码只构建了一部分,或者一个类的定义被不兼容地修改。
- 在Java中,所有实现的接口都是Serializable接口。它是java.io包的一部分。
- 为了解决NoSuchMethodError,要进行完全的清理,然后重新编译包含被调用和调用类的项目。他们也可以使用第三方库的版本来解决问题。