javac throws a NPE when compiling a lambda expression

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Mon Jun 13 01:37:40 PDT 2011


I confirm that the following simplified example actually fails with the 
latest compiler:

class TestLambda {


   interface SAM {
     void m();
   }

   {
     call(#{ -> log(new Date() + "");  });
   }

  void call(SAM s) { }

   void log(String msg) {
     System.out.println(msg);
   }
  }

The problem is caused by a bad error recovery - in the above example 
java.util.Date cannot be found, because the corresponding import is 
missing. Which means that the compiler should emit an error, but in this 
case the error is swallen when attributing the lambda body - which means 
that the compiler tries to emit code for an incorrect source program - 
hence the NPE.

Maurizio


On 13/06/11 07:46, Ali Ebrahimi wrote:
> Hi,
> This sample code compiles with current lambda repository build.
>
> Ali Ebrahimi
>
> On Sat, Jun 11, 2011 at 9:00 AM, Arul Dhesiaseelan<aruld at acm.org>  wrote:
>
>> public class TestLambda {
>>
>>   class Payment {
>>     private int amount;
>>
>>     Payment(int amount) {
>>       this.amount = amount;
>>     }
>>
>>     public int getAmount() {
>>       return amount;
>>     }
>>   }
>>
>>   interface PaymentProcessor {
>>     void process(Payment pmt);
>>   }
>>
>>   {
>>     invokeProcessor(# { pmt ->  log("Processed # " + pmt.getAmount() + " at
>> " + new Date()) });
>>   }
>>
>>   void invokeProcessor(PaymentProcessor processor) {
>>     processor.process(new Payment(42));
>>   }
>>
>>   void log(String msg) {
>>     System.out.println(msg);
>>   }
>> }
>>
>> I am trying to rebuild my old Lambda example (which used to work with
>> earlier prototype using build 115), but failed to compile with the latest
>> prototype using build 145:
>>
>> An exception has occurred in the compiler (1.7.0-internal). 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.visitNewClass(Flow.java:1308)
>>         at
>> com.sun.tools.javac.tree.JCTree$JCNewClass.accept(JCTree.java:1391)
>>         at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49)
>>         at com.sun.tools.javac.comp.Flow.scanExpr(Flow.java:572)
>>         at com.sun.tools.javac.comp.Flow.visitBinary(Flow.java:1504)
>>         at com.sun.tools.javac.tree.JCTree$JCBinary.accept(JCTree.java:1654)
>>         at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49)
>>         at com.sun.tools.javac.comp.Flow.scanExpr(Flow.java:572)
>>         at com.sun.tools.javac.comp.Flow.scanExprs(Flow.java:582)
>>         at com.sun.tools.javac.comp.Flow.visitApply(Flow.java:1299)
>>         at
>> com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept(JCTree.java:1337)
>>         at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49)
>>         at com.sun.tools.javac.comp.Flow.scanStat(Flow.java:556)
>>         at com.sun.tools.javac.comp.Flow.analyzeLambda(Flow.java:1370)
>>         at com.sun.tools.javac.comp.Attr.attribLambda(Attr.java:2314)
>>         at com.sun.tools.javac.comp.Attr$1.deferredAttr(Attr.java:2194)
>>         at com.sun.tools.javac.comp.Attr$1.deferredAttr(Attr.java:2185)
>>         at
>>
>> com.sun.tools.javac.comp.Attr$SAMDeferredAttribution.complete(Attr.java:2793)
>>         at
>> com.sun.tools.javac.comp.Infer$InferPolyCompleter.complete(Infer.java:737)
>>         at com.sun.tools.javac.comp.Infer.instantiatePoly(Infer.java:748)
>>         at
>>
>> com.sun.tools.javac.comp.Resolve.checkRawArgumentsAcceptable(Resolve.java:553)
>>         at com.sun.tools.javac.comp.Infer.instantiateMethod(Infer.java:419)
>>         at com.sun.tools.javac.comp.Resolve.rawInstantiate(Resolve.java:396)
>>         at com.sun.tools.javac.comp.Resolve.selectBest(Resolve.java:820)
>>         at com.sun.tools.javac.comp.Resolve.findMethod(Resolve.java:1064)
>>         at com.sun.tools.javac.comp.Resolve.findMethod(Resolve.java:1025)
>>         at com.sun.tools.javac.comp.Resolve.findFun(Resolve.java:1158)
>>         at com.sun.tools.javac.comp.Resolve.resolveMethod(Resolve.java:1582)
>>         at com.sun.tools.javac.comp.Attr.visitIdent(Attr.java:2546)
>>         at com.sun.tools.javac.tree.JCTree$JCIdent.accept(JCTree.java:1826)
>>         at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:466)
>>         at com.sun.tools.javac.comp.Attr.visitApply(Attr.java:1578)
>>         at
>> com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept(JCTree.java:1337)
>>         at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:466)
>>         at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:484)
>>         at com.sun.tools.javac.comp.Attr.attribExpr(Attr.java:499)
>>         at com.sun.tools.javac.comp.Attr.visitExec(Attr.java:1334)
>>         at
>>
>> com.sun.tools.javac.tree.JCTree$JCExpressionStatement.accept(JCTree.java:1180)
>>         at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:466)
>>         at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:484)
>>         at com.sun.tools.javac.comp.Attr.attribStat(Attr.java:519)
>>         at com.sun.tools.javac.comp.Attr.attribStats(Attr.java:535)
>>         at com.sun.tools.javac.comp.Attr.visitBlock(Attr.java:952)
>>         at com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:794)
>>         at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:466)
>>         at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:484)
>>         at com.sun.tools.javac.comp.Attr.attribStat(Attr.java:519)
>>         at com.sun.tools.javac.comp.Attr.attribClassBody(Attr.java:3793)
>>         at com.sun.tools.javac.comp.Attr.attribClass(Attr.java:3715)
>>         at com.sun.tools.javac.comp.Attr.attribClass(Attr.java:3651)
>>         at com.sun.tools.javac.comp.Attr.attrib(Attr.java:3625)
>>         at
>> com.sun.tools.javac.main.JavaCompiler.attribute(JavaCompiler.java:1189)
>>         at
>> com.sun.tools.javac.main.JavaCompiler.compile2(JavaCompiler.java:877)
>>         at
>> com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:836)
>>         at com.sun.tools.javac.main.Main.compile(Main.java:417)
>>         at com.sun.tools.javac.main.Main.compile(Main.java:331)
>>         at com.sun.tools.javac.main.Main.compile(Main.java:322)
>>         at com.sun.tools.javac.Main.compile(Main.java:76)
>>         at com.sun.tools.javac.Main.main(Main.java:61)
>>
>>
>> java version "1.7.0-ea"
>> Java(TM) SE Runtime Environment (build 1.7.0-ea-b145)
>> Java HotSpot(TM) 64-Bit Server VM (build 21.0-b15, mixed mode)
>>
>> I am not sure what has changed since then. Any clues?
>>
>> -Arul
>>
>>



More information about the lambda-dev mailing list