各位帮忙说说这两者的区别。我先简单说说,就当抛砖引玉了。
NoSuchMethodException继承自Exception
NoSuchMethodError继承自Error 一般有兼容性问题时会抛出该异常
java反射时NoSuchMethodException
[code="java"]
import java.lang.reflect.Method;
public class NoSuchTest {
/**
* @param args
*/
public static void main(String[] args) throws Exception {
Class<String> clazz = String.class;
Method m = clazz.getMethod("Boring");
m.invoke("");
}
}
[/code]
如果A类原来有a方法,B类调用是没问题的;如果后来A类更改了方法签名,旧的B类代码又没有同步更新就好抛NoSuchMethodError
这就是“仅当类定义发生不相容的更改时,在运行时才会发生该错误。 ”
就好像Exception和Error的区别一样,Exception作为异常可以不导致系统中止,而Error作为错误则会直接导致系统中止运行。
那样是不行的,只要是Error肯定是会终止系统运行的。至于什么时候抛出的问题,这要看具体要求具体分析了。如果这个异常本身对你的系统影响不大,那完全可以catch住自己处理,如果想交给上层来处理那就抛出即可。
public class NoSuchMethodErrorextends IncompatibleClassChangeError当应用程序试图调用类(静态或实例)的指定方法,而该类已不再具有该方法的定义时,抛出该异常。
通常由编译器捕获该错误;仅当类定义发生不相容的更改时,在运行时才会发生该错误。
public class NoSuchMethodExceptionextends Exception无法找到某一特定方法时,抛出该异常。
以上来自JDK文档,其实这个没啥可讨论的
如果调用不存在的方法,通常会有编译错误,那只是针对你自己编写的代码而已,试想你在项目中引入了一个jar包,而这个jar包中的某些地方又需要引入另一个jar包的支持,而你并没有引入,这时是可以正常编译的,而当你在运行中调用,就会报找不到方法的错误。