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)))
其中:
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]]
但是,不幸的是,我收到一条错误消息,提示我未找到或定义 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 的列表以避免语言之间类型不兼容的任何问题。
在运行时,根据我的调试过程,我得到以下类型:
chunks
是一个 Vector[Collections$SynchronizedRandomAccessList]
chunksObjRef
是一个 Vector[Collections$SynchronizedRandomAccessList]
感谢您对这个问题的任何帮助。谢谢!
我认为问题出在您的 '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
更好地解决这个问题,我很感激任何建议
我有以下 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)))
其中:
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]]
但是,不幸的是,我收到一条错误消息,提示我未找到或定义 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 的列表以避免语言之间类型不兼容的任何问题。
在运行时,根据我的调试过程,我得到以下类型:
chunks
是一个Vector[Collections$SynchronizedRandomAccessList]
chunksObjRef
是一个Vector[Collections$SynchronizedRandomAccessList]
感谢您对这个问题的任何帮助。谢谢!
我认为问题出在您的 '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
更好地解决这个问题,我很感激任何建议