我得到一个NoSuchMethodError错误时运行我的Java程序。出了什么问题,我该怎么解决?
当前回答
对我来说,这里提到的解决办法没有一个是没用的。
将模拟核从3.3.3更新到3.4.3修复了这个问题。
我认为这是由于MockitoAnnotations.initMock()方法在Mockito JUnit 5 version 3中被弃用并被MockitoAnnotations.openMocks()所取代。
另一方面,检查本地Maven Repository并删除可能导致冲突的不必要的jar可能是值得的。但在使用此步骤时,请注意,不要删除手动安装的(或在操作前备份)。
其他回答
如果您有权更改JVM参数,那么添加详细输出将允许您查看从哪个JAR文件加载了哪些类。
java -verbose:class <other args>
当你的程序运行时,JVM应该转储到标准输出信息,例如:
... [加载junit.framework.Assert from file:/C:/Program%20Files/junit3.8.2/junit.jar] ...
在我的情况下,我有一个多模块项目和场景像com.xyz.TestClass是在模块a,以及在模块B和模块a依赖于模块B。因此,创建一个程序集jar,我认为只有一个版本的类被保留,如果没有调用的方法,然后我得到NoSuchMethodError运行时异常,但编译是好的。
相关网址:https://reflectoring.io/nosuchmethod/
试试这种方法:删除项目目录下的所有.class文件(当然,还有所有子目录)。重建。
有时mvn clean(如果您使用maven)不会清除javac手动创建的.class文件。这些旧文件包含旧签名,导致NoSuchMethodError。
在没有更多信息的情况下,很难确定问题,但根本原因是您很可能针对缺少方法的类的不同版本编译了一个类,而不是您在运行时使用的类。
查看堆栈跟踪…如果在对库中的对象调用方法时出现异常,则很可能在编译和运行时使用了该库的不同版本。确保这两个地方都有正确的版本。
如果在对由您创建的类实例化的对象调用方法时出现异常,那么您的构建过程似乎是错误的。确保在编译时更新了实际运行的类文件。
为了我的案子。我必须检查其他参考方法。我需要将各处的方法签名更改为与新更新的方法签名相同。
例如,将特定方法的返回类型从集合更改为数组列表。
推荐文章
- 在流中使用Java 8 foreach循环移动到下一项
- 访问限制:'Application'类型不是API(必需库rt.jar的限制)
- 用Java计算两个日期之间的天数
- 如何配置slf4j-simple
- 在Jar文件中运行类
- 带参数的可运行?
- 我如何得到一个字符串的前n个字符而不检查大小或出界?
- 我可以在Java中设置enum起始值吗?
- Java中的回调函数
- c#和Java中的泛型有什么不同?和模板在c++ ?
- 在Java中,流相对于循环的优势是什么?
- Jersey在未找到InjectionManagerFactory时停止工作
- 在Java流是peek真的只是调试?
- Recyclerview不调用onCreateViewHolder
- 将JSON字符串转换为HashMap