与类构造函数相关的java.lang.NoSuchMethodError

时间:2015-11-20 17:14:00

标签: java scala nosuchmethoderror

我有以下课程签名:

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来避免语言之间不兼容类型的任何问题。

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

  • chunksVector[Collections$SynchronizedRandomAccessList]
  • chunksObjRefVector[Collections$SynchronizedRandomAccessList]

我很感激对此问题的任何帮助。谢谢!

3 个答案:

答案 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) 

这样可行。