Java"NoSuchMethodError"

vrm*_*vrm 25 java nosuchmethoderror

我越来越:

NoSuchMethodError: com.foo.SomeService.doSmth()Z
Run Code Online (Sandbox Code Playgroud)

我是否正确理解这'Z'意味着doSmth()方法的返回类型是布尔值?如果为true,那么这种方法确实不存在,因为此方法返回一些Collection.但另一方面,如果我调用此方法,我不会将其返回值赋给任何变量.我只是这样调用这个方法:

service.doSmth();
Run Code Online (Sandbox Code Playgroud)

有什么想法发生这个错误?存在所有必需的JAR文件,并且此类中的所有其他方法似乎都存在.

amo*_*fis 24

看起来在编译期间类路径中存在方法,但在应用程序运行期间不存在.

我不认为返回类型是一个问题.如果是,它将无法编译.当方法调用不明确时,编译器抛出错误,并且当两个方法仅由返回类型不同时.


Boz*_*zho 18

通常,编译器会捕获此错误; 如果类的定义发生了不兼容的更改,则此错误只能在运行时发生.

简而言之 - 运行时的类/ jar文件与您在编译时使用的文件不同.


Viv*_*sse 17

这可能是编译时类路径和运行时类路径之间的差异.

这是似乎正在发生的事情:

  • 代码使用类路径编译,该路径定义doSmth()返回布尔值的方法.字节码指的是doSmth()Z方法.
  • 在运行时,doSmth()Z找不到该方法.找到返回Collection的方法.

要解决此问题,请检查(编译时)类路径.