JDK-8025141 : java.lang.ClassFormatError: Illegal field modifiers in class (...)
  • Type: Bug
  • Component: tools
  • Sub-Component: javac
  • Affected Version: 8
  • Priority: P3
  • Status: Closed
  • Resolution: Fixed
  • OS: windows_8
  • Submitted: 2013-09-11
  • Updated: 2013-11-19
  • Resolved: 2013-10-09
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
JDK 8
8 b113Fixed
Description
FULL PRODUCT VERSION :
java version "1.8.0-ea"
Java(TM) SE Runtime Environment (build 1.8.0-ea-lambda-nightly-h109-20130902-b10
6-b00)
Java HotSpot(TM) 64-Bit Server VM (build 25.0-b45, mixed mode)
First observed build 104, persisted after upgrade to 109

ADDITIONAL OS VERSION INFORMATION :
Microsoft Windows [Version 6.2.9200] (Windows 8 64Bit)

A DESCRIPTION OF THE PROBLEM :
The following simple Program, using an assert statement within an interface default method:

package bug;

public class Jdk8Bug {
    public interface B {
        default void m() {
            assert "x" != null;
        }
    }

    static class A implements B {
    }

    public static void main(String[] args) {
        A x = new A();
    }

}

produces upon execution:

Exception in thread "main" java.lang.ClassFormatError: Illegal field modifiers in class bug/Jdk8Bug$B: 0x1018
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:752)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:448)
at java.net.URLClassLoader.access$100(URLClassLoader.java:70)
at java.net.URLClassLoader$1.run(URLClassLoader.java:360)
at java.net.URLClassLoader$1.run(URLClassLoader.java:354)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:353)
at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:752)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:448)
at java.net.URLClassLoader.access$100(URLClassLoader.java:70)
at java.net.URLClassLoader$1.run(URLClassLoader.java:360)
at java.net.URLClassLoader$1.run(URLClassLoader.java:354)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:353)
at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
at bug.Jdk8Bug.main(Jdk8Bug.java:16)
Java Result: 1



STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Just copy the above code, compile and go.

EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
assert should work as expected in default methods
ACTUAL -
Fails with Stacktrace

ERROR MESSAGES/STACK TRACES THAT OCCUR :
Exception in thread "main" java.lang.ClassFormatError: Illegal field modifiers in class bug/Jdk8Bug$B: 0x1018
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:752)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:448)
at java.net.URLClassLoader.access$100(URLClassLoader.java:70)
at java.net.URLClassLoader$1.run(URLClassLoader.java:360)
at java.net.URLClassLoader$1.run(URLClassLoader.java:354)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:353)
at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:752)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:448)
at java.net.URLClassLoader.access$100(URLClassLoader.java:70)
at java.net.URLClassLoader$1.run(URLClassLoader.java:360)
at java.net.URLClassLoader$1.run(URLClassLoader.java:354)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:353)
at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
at bug.Jdk8Bug.main(Jdk8Bug.java:16)
Java Result: 1

REPRODUCIBILITY :
This bug can be reproduced always.

---------- BEGIN SOURCE ----------
package bug;

public class Jdk8Bug {

    public interface B {

        default void m() {
            assert "x" != null;
        }

    }

    static class A implements B {
    }

    public static void main(String[] args) {
        A x = new A();
    }

}

---------- END SOURCE ----------

CUSTOMER SUBMITTED WORKAROUND :
Don't use assert within default methods