Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get java.lang.NoSuchMethodError

Introduction:

There are many questions as How to fix java.lang.NoSuchMethodError on SO.

As I can see, the simplest way to get this error, is to make a class

class MyClass {} // no methods at all, for instance

without properly defined main method, compile it and run:

java MyClass

Exception emerges:

Exception in thread "main" java.lang.NoSuchMethodError: main

But this example is too simple.

The question:

Could anyone provide a simple code, which

  1. Consists of two, maximum three classes (if you can show that more classes are needed - then you are welcome);
  2. Contains properly defined main method;
  3. Running of the class with that main method, leads to exception with java.lang.NoSuchMethodError.
like image 681
MockerTim Avatar asked Dec 07 '22 20:12

MockerTim


2 Answers

NoSuchMethodError happens if one class expects a method in another class (and was compiled with that method in place), but at runtime the other class does not have that method. So you need to:

  • create two classes, one of which calls a method on the other
  • compile the two classes
  • then remove the invoked method from the 2nd class, and compile the 2nd class only

Then, if you run the first class (with main method), it will throw that error when trying to call the method on the 2nd class (the method no longer exists)

This example would rarely happen in the real world though. Here are some real cases when the error occurs:

  • You are using a 3rd party library (jar) that depends on another jar. However you are having incompatible versions of those jars, and the 1st one tries to invoke a method on a class in the 2nd jar that does not exist anymore/yet.
  • Your compile-time and runtime classpaths differ - you have compiled your code against a version of some library (that can also be the JDK itself), but your runtime is having other versions
  • You have a multi-module project. Your IDE "links" the project at compile-time, so any changes is seen immediately. But when you build you forget to compile one of the modules (where you have added a method), so at runtime it is using the old version.
like image 105
Bozho Avatar answered Dec 10 '22 11:12

Bozho


Create a class file from a class which calls java.util.Properties.load(Reader) in its main method with some Java version >= 1.6.xxxx.

Attempt to execute this class using some Java version < 1.6.xxxx

Reason: java.util.Properties.load(Reader) was introduced in Java 6. It is being called, but does not exist in this version of Java.

This applies similarly to all methods introduced to the default language libraries in updates.

like image 45
Zéychin Avatar answered Dec 10 '22 11:12

Zéychin