NoSuchMethodError与NoSuchMethodException
一、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.class和Data.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
How do I fix a NoSuchMethodError?
Java Exception Handling – NoSuchMethodError
3 Steps to Fix NoSuchMethodErrors and NoSuchMethodExceptions