replace assert by throw new AssertionError

Peter Ahé peter at ahe.dk
Wed Oct 3 15:25:00 PDT 2007


Some parts of javac use this (in my opinion, very bad) coding idiom:

assert false;

When javac is launched from elsewhere than the command-line, without
assertions enabled, it may skip happily over this and compile a piece
of text that does not represent  a program written in the Java
programming language.  This is a conformance violation which is bad.

Even worse is that the compiler may seem to work but generate bad class files.

Even when assertions are enabled, the user will get a lousy error
message and have no clue how to change the source code to get past it.
 That is almost as great a sins as producing bad class files.

Ideally, all assertions should be turned into explicit exceptions that
included all the details needed to give a proper diagnostic at a
higher level.  What I'm saying is that this is much better:

Bug.java:14: internal error; please report this bug at
http://java.sun.com/webapps/bugreport
                    s(t);
                    ^

Than this:

An exception has occurred in the compiler (1.5.0_02). 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.AssertionError
        at com.sun.tools.javac.comp.Lower.access(Lower.java:958)
        at com.sun.tools.javac.comp.Lower.access(Lower.java:1051)
        at com.sun.tools.javac.comp.Lower.makeOwnerThis(Lower.java:1382)
        at com.sun.tools.javac.comp.Lower.accessBase(Lower.java:877)
        at com.sun.tools.javac.comp.Lower.access(Lower.java:1037)
        at com.sun.tools.javac.comp.Lower.visitIdent(Lower.java:2762)
        at com.sun.tools.javac.tree.Tree$Ident.accept(Tree.java:1009)
        at com.sun.tools.javac.comp.Lower.translate(Lower.java:1895)
        at com.sun.tools.javac.comp.Lower.visitApply(Lower.java:2487)
        at com.sun.tools.javac.tree.Tree$Apply.accept(Tree.java:819)
        at com.sun.tools.javac.comp.Lower.translate(Lower.java:1895)
        at com.sun.tools.javac.tree.TreeTranslator.visitExec(TreeTranslator.java:227)
        at com.sun.tools.javac.tree.Tree$Exec.accept(Tree.java:734)
        at com.sun.tools.javac.comp.Lower.translate(Lower.java:1895)
        at com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:54)
        at com.sun.tools.javac.tree.TreeTranslator.visitBlock(TreeTranslator.java:145)
        at com.sun.tools.javac.comp.Lower.visitBlock(Lower.java:2944)
        at com.sun.tools.javac.tree.Tree$Block.accept(Tree.java:540)
        at com.sun.tools.javac.comp.Lower.translate(Lower.java:1895)
        at com.sun.tools.javac.tree.TreeTranslator.visitMethodDef(TreeTranslator.java:129)
        at com.sun.tools.javac.comp.Lower.visitMethodDefInternal(Lower.java:2281)
        at com.sun.tools.javac.comp.Lower.visitMethodDef(Lower.java:2200)
        at com.sun.tools.javac.tree.Tree$MethodDef.accept(Tree.java:482)
        at com.sun.tools.javac.comp.Lower.translate(Lower.java:1895)
        at com.sun.tools.javac.comp.Lower.visitClassDef(Lower.java:2003)
        at com.sun.tools.javac.tree.Tree$ClassDef.accept(Tree.java:438)
        at com.sun.tools.javac.comp.Lower.translate(Lower.java:1895)
        at com.sun.tools.javac.comp.Lower.visitNewClass(Lower.java:2340)
        at com.sun.tools.javac.tree.Tree$NewClass.accept(Tree.java:845)
        at com.sun.tools.javac.comp.Lower.translate(Lower.java:1895)
        at com.sun.tools.javac.comp.Lower.translate(Lower.java:1907)
        at com.sun.tools.javac.comp.Lower.boxArgs(Lower.java:2530)
        at com.sun.tools.javac.comp.Lower.visitApply(Lower.java:2433)
        at com.sun.tools.javac.tree.Tree$Apply.accept(Tree.java:819)
        at com.sun.tools.javac.comp.Lower.translate(Lower.java:1895)
        at com.sun.tools.javac.tree.TreeTranslator.visitExec(TreeTranslator.java:227)
        at com.sun.tools.javac.tree.Tree$Exec.accept(Tree.java:734)
        at com.sun.tools.javac.comp.Lower.translate(Lower.java:1895)
        at com.sun.tools.javac.comp.Lower.visitMethodDefInternal(Lower.java:2244)
        at com.sun.tools.javac.comp.Lower.visitMethodDef(Lower.java:2200)
        at com.sun.tools.javac.tree.Tree$MethodDef.accept(Tree.java:482)
        at com.sun.tools.javac.comp.Lower.translate(Lower.java:1895)
        at com.sun.tools.javac.comp.Lower.visitClassDef(Lower.java:2003)
        at com.sun.tools.javac.tree.Tree$ClassDef.accept(Tree.java:438)
        at com.sun.tools.javac.comp.Lower.translate(Lower.java:1895)
        at com.sun.tools.javac.comp.Lower.visitClassDef(Lower.java:2003)
        at com.sun.tools.javac.tree.Tree$ClassDef.accept(Tree.java:438)
        at com.sun.tools.javac.comp.Lower.translate(Lower.java:1895)
        at com.sun.tools.javac.comp.Lower.translate(Lower.java:1915)
        at com.sun.tools.javac.comp.Lower.translateTopLevelClass(Lower.java:3081)
        at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:496)
        at com.sun.tools.javac.main.Main.compile(Main.java:592)
        at com.sun.tools.javac.main.Main.compile(Main.java:544)
        at com.sun.tools.javac.Main.compile(Main.java:67)
        at com.sun.tools.javac.Main.main(Main.java:52)

Cheers,
Peter

On 10/3/07, Jesse Glick <jesse.glick at sun.com> wrote:
> Jonathan Gibbons wrote:
> > javac currently contains assertion statements, and goes out of its
> > way to ensure assertions are enabled.
>
> Why? Wouldn't non-javac developers just want it to run as fast as
> possible and trust that it is not buggy? You can always use -J-ea to
> enable assertions if you want to be sure, right?
>
> -J.
>
> --
> jesse.glick at sun.com  netbeans.org  ant.apache.org  hudson.dev.java.net
>              http://google.com/search?q=e%5E%28pi*i%29%2B1
>
>



More information about the compiler-dev mailing list