The NoSuchFieldError
is an error in Java that occurs when a specified field does not exist. It is thrown when an application attempts to access or modify a field of an object or a static field of a class but the object or class no longer contains that field.
The NoSuchFieldError
only occurs during runtime if the definition of a class has changed incompatibly. Since it is thrown at runtime, it does not need to be declared in the throws
clause of a method or constructor.
 
What Causes NoSuchFieldError
The NoSuchFieldError
error occurs if an application tries to access or modify a specified field of an object, and the object no longer has that field. This can occur if the definition of a class changes incompatibly after compilation.
In case code is only partially recompiled, old code can exist that references a field which no longer exists in the recompiled classes, causing the NoSuchFieldError
.
 
NoSuchFieldError Example
Here is an example of a NoSuchFieldError
thrown when a field that does not exist is referenced.
Here’s a class MyClass
that contains a static variable msg
:
public class MyClass {
public static String msg = "Hello World";
}
Here’s a class NoSuchFieldErrorExample
that refers to the static variable str
from MyClass
and prints out its value:
public class NoSuchFieldErrorExample {
public static void main(String args[]) {
System.out.println(MyClass.msg);
}
}
Running the above code produces the correct output as expected:
Hello World
Now, if the variable msg
is removed from MyClass
:
public class MyClass {}
And only MyClass
is recompiled, but not NoSuchFieldErrorExample
:
javac MyClass.java
Now if the program is executed again:
java NoSuchFieldErrorExample
The following error is thrown:
Exception in thread "main" java.lang.NoSuchFieldError: msg
at NoSuchFieldErrorExample.main(NoSuchFieldErrorExample.java:3)
This is because the definition of MyClass
was changed (a field was removed) and a class that referenced its members (NoSuchFieldErrorExample
) was not recompiled. This change is incompatible since a referenced field no longer exists, causing a NoSuchFieldError
.
 
How to Resolve NoSuchFieldError
To avoid the NoSuchFieldError
, all existing files should be cleaned and compiled from scratch. All the latest compiled files will then be available, so any missing fields in code will be pointed out by the compiler, helping avoid the NoSuchFieldError
at runtime.
If the error persists after recompilation, it may be because of using different versions of external JAR files at compile time and runtime. In such cases, the same version of JAR files should be used.
It's also helpful to run the application with the -verbose: class
option to check the loaded classes. This can help identify the incompatible class.
 
Track, Analyze and Manage Errors With Rollbar
Managing Java errors and exceptions in your code is challenging. It can make deploying production code an unnerving experience. Being able to track, analyze, and manage errors in real-time can help you to proceed with more confidence. Rollbar automates error monitoring and triaging, making fixing Java errors easier than ever. Sign Up Today!