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