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.