javac throwing NPE at com.sun.tools.javac.comp.Flow$FlowAnalyzer.visitApply

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Mon Nov 19 05:16:55 PST 2012


On 19/11/12 09:55, Filipp Zhinkin wrote:
> Hi,
>
> I've found that following code force javac to throw NullPointerException:
>
> public class NPE {
>       public static void main(String args[]) {
>           // "cannot find symbol" error is expected
>           new Integer(0).forEach(System.out::println);
>       }
> }
>
> $java -version
> openjdk version "1.8.0-ea"
> OpenJDK Runtime Environment (build
> 1.8.0-ea-lambda-nightly-h1745-20121105-b64-b00)
> OpenJDK Server VM (build 25.0-b05, mixed mode)
>
> $javac NPE.java
> An exception has occurred in the compiler (1.8.0-ea). 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.Flow$FlowAnalyzer.visitApply(Flow.java:1197)
>       at
> com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept(JCTree.java:1395)
>       at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49)
>       at com.sun.tools.javac.tree.TreeScanner.visitExec(TreeScanner.java:173)
>       at
> com.sun.tools.javac.tree.JCTree$JCExpressionStatement.accept(JCTree.java:1226)
>       at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49)
>       at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:57)
>       at com.sun.tools.javac.comp.Flow$FlowAnalyzer.visitBlock(Flow.java:960)
>       at com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:839)
>       at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49)
>       at
> com.sun.tools.javac.comp.Flow$FlowAnalyzer.visitMethodDef(Flow.java:927)
>       at com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:723)
>       at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49)
>       at
> com.sun.tools.javac.comp.Flow$FlowAnalyzer.visitClassDef(Flow.java:890)
>       at com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:645)
>       at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49)
>       at
> com.sun.tools.javac.comp.Flow$FlowAnalyzer.analyzeTree(Flow.java:1277)
>       at
> com.sun.tools.javac.comp.Flow$FlowAnalyzer.analyzeTree(Flow.java:1267)
>       at com.sun.tools.javac.comp.Flow.analyzeTree(Flow.java:210)
>       at com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1297)
>       at com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1271)
>       at
> com.sun.tools.javac.main.JavaCompiler.compile2(JavaCompiler.java:911)
>       at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:870)
>       at com.sun.tools.javac.main.Main.compile(Main.java:441)
>       at com.sun.tools.javac.main.Main.compile(Main.java:358)
>       at com.sun.tools.javac.main.Main.compile(Main.java:347)
>       at com.sun.tools.javac.main.Main.compile(Main.java:338)
>       at com.sun.tools.javac.Main.compile(Main.java:76)
>       at com.sun.tools.javac.Main.main(Main.java:61)
>
>
> With method reference replaced by lambda expression javac will report
> semantic error as expected:
>
> public class SemError {
>       public static void main(String args[]) {
>           new Integer(0).forEach((x) -> { System.out.println(x); });
>       }
> }
>
> $javac SemError.java
> SemError.java:3: error: cannot find symbol
>           new Integer(0).forEach((x) -> { System.out.println(x); });
>                         ^
>     symbol:   method forEach(<none>)
>     location: class Integer
> 1 error
>
> Hope it will be useful.
This seems to be fixed in the latest compiler - I get:

error: cannot find symbol
          new Integer(0).forEach(System.out::println);
                        ^
   symbol:   method forEach(<none>)
   location: class Integer


The diagnostic should be improved of course - i.e. it should not be 
displaying that <none>, burt no exception is coming from javac.


Maurizio
>
> Filipp.
>
>



More information about the lambda-dev mailing list