我有以下课程签名:
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)))
其中:
RateLimiter
来自import com.google.common.util.concurrent.RateLimiter
chunks
定义为val chunks:util.List[util.List[String]] = new util.Vector[util.List[String]]
chunksObjRef
定义为val chunksObjRef:util.List[util.List[String]] = new util.Vector[util.List[String]]
但是,不幸的是,我收到错误,告诉我没有找到或定义类构造函数:
java.lang.NoSuchMethodError: BlockstemRequester.<init>(Lcom/google/common/util/concurrent/RateLimiter;Ljava/lang/String;Ljava/util/List;Ljava/util/List;)
基本上,我在我的java代码项目中使用Scala中定义的这个类,并且我确实将scala类定义为使用java中的List来避免语言之间不兼容类型的任何问题。
在运行时我根据我的调试过程获得以下类型:
chunks
是Vector[Collections$SynchronizedRandomAccessList]
chunksObjRef
是Vector[Collections$SynchronizedRandomAccessList]
我很感激对此问题的任何帮助。谢谢!
答案 0 :(得分:2)
根据Java docs:
如果应用程序尝试调用类的指定方法,则抛出该异常 (静态或实例),该类不再具有定义 那种方法。通常,编译器会捕获此错误;这个 错误只能在运行时发生,如果类的定义有 不一致地改变了。
从您的问题来看,目前尚不清楚您是在编译时还是在运行时获得此信息,但看起来您在运行时遇到了问题。因此,使用Java反编译器并检查此类的.class
是否存在此方法。
这个问题的最可能的根本原因是在编译时使用的库有这样的方法,但在运行时使用的库没有它,因此NoSuchMethodError
。
使用反编译器并检查班级的.class
文件。
答案 1 :(得分:2)
刚刚解决了问题。所以这就是场景:我有一个项目X并使用库Y.所以X和Y都有不同的BlockstemRequester类定义,两者都有不同的构造函数签名。我不得不更改项目的类名并重构我的代码。因此,在运行时,构造函数指出它是我的项目X中的那个而不是来自库Y中定义的那个
我感谢任何建议,如果有任何方法可以更好地解决这个问题,而不仅仅是重命名/重构我的本地类
答案 2 :(得分:0)
我认为问题出在你的'打字'列表中。
如果您将签名更改为
public BlockstemRequester(RateLimiter throttler,
String url, List payloadsToBeRequested, List objRef)
或
public BlockstemRequester(RateLimiter throttler,
String url, List<?> payloadsToBeRequested, List<?> objRef)
这样可行。