一、NoSuchMethodError

1、简介

NoSuchMethodError属于java.lang.Error的子类;在应用程序尝试调用类(静态或实例)的指定方法,而该类不再具有该方法的定义时抛出。通常,此错误由编译器捕获; 只有当类的定义发生了不相容的更改时,此错误才会在运行时发生。

2、异常重现

  • 源码

Data.java:

public class Data {

	public void foo() {
		System.out.println("foo");
	}
	
	public void bar() {
 		System.out.println("bar");
 	}
}

Test.java

public class Test{

	public static void main(String[] args) {
		Data d = new Data();
		d.foo();
		d.bar();
	}

}
  • 编译

切换到源码所在目录,运行javac Test.java,此时会生成Test.classData.class

修改Data.java,注释掉bar()方法后运行javac Data.java只编译Data类。

Data.class:

Test.class:

  • 运行

运行java Test命令:

  • 分析

可以在运行时增加-verbose:class参数输出详细信息来分析是从哪些jar文件中加载的class文件导致的。

二、NoSuchMethodException

1、简介

NoSuchMethodException属于java.lang.Exception的子类,当找不到特定的方法时抛出。

2、异常重现

String.class.getMethod("foo");

执行上述代码即可产生此异常,一般在反射调用时会发生此异常。

参考资料:

java.lang.NoSuchMethodError Example

NoSuchMethodError

NoSuchMethodException

How do I fix a NoSuchMethodError?

Java Exception Handling – NoSuchMethodError

3 Steps to Fix NoSuchMethodErrors and NoSuchMethodExceptions