Chris Martin

Javac bug report

I have been cursing at Java a lot lately. Over this past week, it’s because I’ve been experiencing inexplicable compilation failures. I finally tracked down the cause and submitted this bug report.

Steps to reproduce

Create files One.java and Two.java, and run `javac *.java`.

/* One.java */
package one;
import static one.Two.three;
public class One<A> { }

/* Two.java */
package one;
public class Two<B> extends One<B> {
    public static Object three;
}

Error message

An exception has occurred in the compiler (1.6.0_21). Please file a bug at
the Java Developer Connection (http://java.sun.com/webapps/bugreport) after
checking the Bug Parade for duplicates. Include your program and the
following diagnostic in your report. Thank you.

java.lang.NullPointerException
  at com.sun.tools.javac.comp.Check.checkCompatibleConcretes(Check.java:1215)
  at com.sun.tools.javac.comp.Check.checkCompatibleSupertypes(Check.java:1567)
  at com.sun.tools.javac.comp.Attr.attribClassBody(Attr.java:2674)
  at com.sun.tools.javac.comp.Attr.attribClass(Attr.java:2628)
  at com.sun.tools.javac.comp.Attr.attribClass(Attr.java:2564)
  at com.sun.tools.javac.main.JavaCompiler.attribute(JavaCompiler.java:1036)
  at com.sun.tools.javac.main.JavaCompiler.compile2(JavaCompiler.java:765)
  at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:730)
  at com.sun.tools.javac.main.Main.compile(Main.java:353)
  at com.sun.tools.javac.main.Main.compile(Main.java:279)
  at com.sun.tools.javac.main.Main.compile(Main.java:270)
  at com.sun.tools.javac.Main.compile(Main.java:69)
  at com.sun.tools.javac.Main.main(Main.java:54)

Workaround

From what I can tell, the problem is only encountered when using static imports, and when a class has the same (case-insensitive) name as a package in which it resides. Avoiding either of these situations is sufficient to work around this bug.

Addendum

I don’t understand why no one else seems to be complaining about this bug, because lately I can’t seem to avoid it.

Perhaps I was too hasty in posting the bug report a few days ago, because I’ve discovered now that it happens in more cases than I thought. A namespace clash is not even necessary. You can change the package name and get the same error:

/* One.java */
package abc;
import static abc.Two.three;
public class One<A> { }

/* Two.java */
package abc;
public class Two<B> extends One<B> {
    public static Object three;
}

This is absurd.

I write about Haskell and related topics; you can find my works online on Type Classes and in print from The Joy of Haskell.