java.lang.NoSuchMethodError类介绍

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,要进行完全的清理,然后重新编译包含被调用和调用类的项目。他们也可以使用第三方库的版本来解决问题。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程