A DESCRIPTION OF THE REQUEST :
When a static initializer fails with an exception, an ExceptionInInitializerError with cause is thrown to the code initially trying to use the class���good.
But after that initial ExceptionInInitializerError, subsequent attempts to use the class throw a NoClassDefFoundError with no cause, offering no information about the original exception.
JUSTIFICATION :
In a large software system it is easy for the initial ExceptionInInitializerError to be lost somehow. Perhaps it was printed to a log, but this was rotated out of easy view���or deleted altogether. Perhaps some code caught LinkageError but ���swallowed��� it or logged it only at a verbose level; this is not so uncommon when using a dependency injection framework, a module system resilient to binary compatibility issues, and so on.
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
Would prefer to have the ExceptionInInitializerError be retained and used as the cause for a subsequent NoClassDefFoundError:
Exception in thread "main" java.lang.NoClassDefFoundError: Could not initialize class Demo$CrucialComponent
at Demo.main(Demo.java:6)
Caused by: java.lang.ExceptionInInitializerError
at Demo.main(Demo.java:4)
Caused by: java.lang.IllegalStateException: Too many blattlies!
at Demo$CrucialComponent.<clinit>(Demo.java:11)
... 1 more
ACTUAL -
In JDK 7u7:
Exception in thread "main" java.lang.NoClassDefFoundError: Could not initialize class Demo$CrucialComponent
at Demo.main(Demo.java:6)
---------- BEGIN SOURCE ----------
public class Demo {
public static void main(String... args) {
try {
CrucialComponent.run();
} catch (LinkageError x) {}
CrucialComponent.run();
}
static class CrucialComponent {
static {
if (Demo.class != null) {
throw new IllegalStateException("Too many blattlies!");
}
}
static void run() {}
}
}
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
None known.