java.lang.NoSuchMethodError 与 class 构造函数相关

java.lang.NoSuchMethodError related with a class constructor

我有以下 class 签名:

public BlockstemRequester(RateLimiter throttler, 
                    String url, List<String> payloadsToBeRequested, List<String> objRef) {
.
.
.
}

我在以下代码中使用该构造函数:

threads.add(new BlockstemRequester(RateLimiter.create(1.0),
              String.format("url...", apiKey), 
              chunks.get(index), 
              chunksObjRef.get(index)))

其中:

但是,不幸的是,我收到一条错误消息,提示我未找到或定义 class 构造函数:

java.lang.NoSuchMethodError: BlockstemRequester.<init>(Lcom/google/common/util/concurrent/RateLimiter;Ljava/lang/String;Ljava/util/List;Ljava/util/List;)

基本上,我在我的 java 代码项目中使用 Scala 中定义的 class,并且我确实定义了 Scala class 以使用来自 java 的列表以避免语言之间类型不兼容的任何问题。

在运行时,根据我的调试过程,我得到以下类型:

感谢您对这个问题的任何帮助。谢谢!

我认为问题出在您的 'typed' 列表上。

如果将签名更改为

public BlockstemRequester(RateLimiter throttler, 
       String url, List payloadsToBeRequested, List objRef) 

public BlockstemRequester(RateLimiter throttler, 
       String url, List<?> payloadsToBeRequested, List<?> objRef) 

这会起作用。

根据Java docs

Thrown if an application tries to call a specified method of a class (either static or instance), and that class no longer has a definition of that method. Normally, this error is caught by the compiler; this error can only occur at run time if the definition of a class has incompatibly changed.

从你的问题来看,不清楚你是在编译时还是在 运行 时得到这个,但看起来你在 运行 时遇到了问题。因此,使用 Java 反编译器并检查此 class 的 .class 是否存在此方法。

这个问题最可能的根本原因是编译时使用的库有这样的方法,但 运行 时使用的库没有,因此 NoSuchMethodError.

使用反编译器并检查 class.

.class 文件

刚刚解决了问题。所以这是这样的场景:我有一个项目 X 并使用一个库 Y。所以 X 和 Y 都有不同的 class BlockstemRequester 定义,它们都具有不同的构造函数签名。我不得不更改项目的 class 名称并重构我的代码。因此,在运行时,构造函数指出它是来自我的项目 X 而不是来自库 Y

中定义的那个

如果有任何方法可以比 renaming/refactoring 我的本地 classes

更好地解决这个问题,我很感激任何建议