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