Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中NoSuchMethodException和NoSuchMethodError的区别_Java_Throwable - Fatal编程技术网

Java中NoSuchMethodException和NoSuchMethodError的区别

Java中NoSuchMethodException和NoSuchMethodError的区别,java,throwable,Java,Throwable,我找不到Java中NoSuchMethodException和NoSuchMethodError之间的确切区别。有人能解释一下这两件事并举例说明吗 找不到特定方法时引发 当应用程序试图调用类的指定方法时引发 (静态或实例),并且该类不再具有定义 这种方法的优点 也可以看到这一点,它解释得更好。当您通过反射调用方法时,可以抛出NoSuchMethodException,并且方法的名称来自程序中的变量 当编译的Java类对另一个类执行常规方法调用,而该方法不存在时,可以抛出NoSuchMethod

我找不到Java中
NoSuchMethodException
NoSuchMethodError
之间的确切区别。有人能解释一下这两件事并举例说明吗

找不到特定方法时引发

当应用程序试图调用类的指定方法时引发 (静态或实例),并且该类不再具有定义 这种方法的优点


也可以看到这一点,它解释得更好。

当您通过反射调用方法时,可以抛出NoSuchMethodException,并且方法的名称来自程序中的变量


当编译的Java类对另一个类执行常规方法调用,而该方法不存在时,可以抛出NoSuchMethodError。(这通常发生在调用方类是针对被调用类的一个版本编译的,并且与该类的另一个版本一起执行时,该版本不再具有该方法。)

NoSuchMethodException
在尝试使用反射调用方法时发生。
NoSuchMethodError
当您在编译时拥有该方法,但在运行时没有该方法时,会发生此错误

请考虑以下示例以了解
NoSuchMethodError

类:Person.java

public class Person{
      public String getName(){
         return "MyName";
     }
}
使用
javacperson.java
现在尝试使用
java人

它会给你

java.lang.NoSuchMethodError: main
Exception in thread "main"
因为它试图找到不存在的
公共静态void main(String[]args)

对于
NoSuchMethodException

c = Class.forName("java.lang.String");
  try
  {
    Class[] paramTypes = new Class[2];
    Method m = c.getDeclaredMethod("myMethod", paramTypes);
  }
这是一个将抛出异常的语句

java.lang.NoSuchMethodException: java.lang.String.myMethod(null, null)

考虑这一点,它有更好的解释

,当您尝试获得一个反射不存在的方法时抛出。例如,使用错误的名称或参数调用
Class#getDeclaredMethod(名称、参数)


NoSuchMethodError
虚拟机找不到您尝试调用的方法时抛出。当您使用库的一个版本编译,然后在类路径上使用库的另一个版本运行应用程序时(例如,一个旧版本没有您正在调用的方法),可能会发生这种情况。

Hai Maroun:我无法理解“类不再有该方法的定义”请解释此语句。这意味着调用类不知道已更改的类。当调用类被编译时,方法就在那里,但是运行时发生了变化,它无法找到它anymore@Balasubramani如果有一个方法a.method1()调用B.method2(),则在不重新编译类a的情况下删除B.method2()你得到了一个NoSuchMethodError吗?我从Peter Lawrey那里得到了一个更准确的答案。谢谢Peter。链接页面上说,既然[NoSuchMethodException]是一个异常,你可以简单地捕捉它并继续你的流程,而NoSuchMethodError是不可能的,你知道为什么它说它不可能吗?可能不建议捕获
错误
s或其他主观因素,但这绝对是可能的,而且对于任何
可丢弃的
,都应该是可能的。当调用可能预期目标方法可能丢失的方法时,不会发生任何方法异常。当方法丢失时,会发生NoSuchMethodError,但通常情况下它不会出现,即在普通代码中。关于
NoSuchMethodException
情况,要引发此异常,方法的名称是否确实需要来自变量?它可能是字段,也可能是调用方法或计算表达式的结果。当然,实际上我的问题不太清楚,我的意思是它可以是字符串文字还是常量?