Saulo Ricci
Saulo Ricci

Reputation: 774

java.lang.NoSuchMethodError related with a class constructor

I have the following class signature:

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

And I'm using that constructor at this following code:

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

where:

But, unfortunately I'm getting an error telling me that class constructor was not found or defined:

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

Basically, I'm using this class defined in Scala at my java code project, and I did defined the scala class to use List from java to avoid any problem of incompatible types between the languages.

At runtime I'm getting this following types according to my debug process:

I appreciate any kind of help towards this problem. Thank you!

Upvotes: 1

Views: 8539

Answers (3)

Saulo Ricci
Saulo Ricci

Reputation: 774

Just solved the problem. So this was the scenario: I have a project X and using a library Y. So both X and Y have different definition of the class BlockstemRequester, both with different constructor signatures. I had to change that class name of my project and refactor my code. So, at runtime the constructor pointed out it was that one from my project X and not from that one defined in the library Y

I appreciate any advise if there is any way to approach this problem better than just renaming/refactoring my local classes

Upvotes: 3

pjj
pjj

Reputation: 2125

As per 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.

From you question it is not clear if you are getting this at compile time or run time but looks like you are having issue at run time. So, use a Java decompiler and check the .class of this class whether this method is present or not.

Most probable root cause of this issue is that library used at compile time have such a method but library used at runtime doesn't have it, and hence NoSuchMethodError.

Use decompiler and check .class file of the class.

Upvotes: 2

JFPicard
JFPicard

Reputation: 5168

I think that the problem is with your 'typed' list.

If you change the signature to

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

Or

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

This will work.

Upvotes: 0

Related Questions