Internal compiler error for Lambda expression in Java8

I am running a small code to test Java8 lambda reduce() functionality. I have a list of objects of type Person with the name and age fields. I am trying to find the sum of the ages of all people using Java8 functionality reduction. The code is below:

 public class Person { String name; Integer age; public Person(String name, Integer age) { this.name = name; this.age = age; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } } public class TestReduce { public static void main(String[] args){ Person p1 = new Person("P1", 10); Person p2 = new Person("P2", 20); Person p3 = new Person("P3", 30); List<Person> personList = new ArrayList<Person>(); personList.add(p1); personList.add(p2); personList.add(p3); int sumAge = personList.stream() .reduce(0, (result, person) -> result += person.age, Integer::sum); } } 

When I run the above code, I get the following error, although there is no compilation error in my IDE.

 Using javac 1.8.0_25 to compile java sources java: An exception has occurred in the compiler (1.8.0_25). 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: java.lang.NullPointerException java: at com.sun.tools.javac.code.Types.isConvertible(Types.java:290) java: at com.sun.tools.javac.comp.Check.assertConvertible(Check.java:922) java: at com.sun.tools.javac.comp.Check.checkMethod(Check.java:876) java: at com.sun.tools.javac.comp.Attr.checkMethod(Attr.java:3838) java: at com.sun.tools.javac.comp.Attr.checkIdInternal(Attr.java:3615) java: at com.sun.tools.javac.comp.Attr.checkMethodIdInternal(Attr.java:3522) java: at com.sun.tools.javac.comp.Attr.checkMethodId(Attr.java:3501) java: at com.sun.tools.javac.comp.Attr.checkId(Attr.java:3488) java: at com.sun.tools.javac.comp.Attr.visitSelect(Attr.java:3370) java: at com.sun.tools.javac.tree.JCTree$JCFieldAccess.accept(JCTree.java:1897) java: at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:607) java: at com.sun.tools.javac.comp.Attr.visitApply(Attr.java:1843) java: at com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept(JCTree.java:1465) java: at com.sun.tools.javac.comp.Attr.attribExpr(Attr.java:649) java: at com.sun.tools.javac.comp.Attr.visitVarDef(Attr.java:1093) java: at com.sun.tools.javac.tree.JCTree$JCVariableDecl.accept(JCTree.java:852) java: at com.sun.tools.javac.comp.Attr.attribStat(Attr.java:676) java: at com.sun.tools.javac.comp.Attr.attribStats(Attr.java:692) java: at com.sun.tools.javac.comp.Attr.visitBlock(Attr.java:1142) java: at com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:909) java: at com.sun.tools.javac.comp.Attr.visitMethodDef(Attr.java:1035) java: at com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:778) java: at com.sun.tools.javac.comp.Attr.attribClassBody(Attr.java:4342) java: at com.sun.tools.javac.comp.Attr.attribClass(Attr.java:4252) java: at com.sun.tools.javac.comp.Attr.attribClass(Attr.java:4181) java: at com.sun.tools.javac.comp.Attr.attrib(Attr.java:4156) java: at com.sun.tools.javac.main.JavaCompiler.attribute(JavaCompiler.java:1248) java: at com.sun.tools.javac.main.JavaCompiler.compile2(JavaCompiler.java:901) java: at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:860) java: at com.sun.tools.javac.main.Main.compile(Main.java:523) java: at com.sun.tools.javac.api.JavacTaskImpl.doCall(JavacTaskImpl.java:129) java: at com.sun.tools.javac.api.JavacTaskImpl.call(JavacTaskImpl.java:138) java: at org.jetbrains.jps.javac.JavacMain.compile(JavacMain.java:165) java: at org.jetbrains.jps.incremental.java.JavaBuilder.compileJava(JavaBuilder.java:407) java: at org.jetbrains.jps.incremental.java.JavaBuilder.compile(JavaBuilder.java:304) java: at org.jetbrains.jps.incremental.java.JavaBuilder.doBuild(JavaBuilder.java:210) java: at org.jetbrains.jps.incremental.java.JavaBuilder.build(JavaBuilder.java:182) java: at org.jetbrains.jps.incremental.IncProjectBuilder.runModuleLevelBuilders(IncProjectBuilder.java:1106) java: at org.jetbrains.jps.incremental.IncProjectBuilder.runBuildersForChunk(IncProjectBuilder.java:814) java: at org.jetbrains.jps.incremental.IncProjectBuilder.buildTargetsChunk(IncProjectBuilder.java:862) java: at org.jetbrains.jps.incremental.IncProjectBuilder.buildChunkIfAffected(IncProjectBuilder.java:777) java: at org.jetbrains.jps.incremental.IncProjectBuilder.buildChunks(IncProjectBuilder.java:600) java: at org.jetbrains.jps.incremental.IncProjectBuilder.runBuild(IncProjectBuilder.java:352) java: at org.jetbrains.jps.incremental.IncProjectBuilder.build(IncProjectBuilder.java:184) java: at org.jetbrains.jps.cmdline.BuildRunner.runBuild(BuildRunner.java:129) java: at org.jetbrains.jps.cmdline.BuildSession.runBuild(BuildSession.java:224) java: at org.jetbrains.jps.cmdline.BuildSession.run(BuildSession.java:113) java: at org.jetbrains.jps.cmdline.BuildMain$MyMessageHandler$1.run(BuildMain.java:157) java: at org.jetbrains.jps.service.impl.SharedThreadPoolImpl$1.run(SharedThreadPoolImpl.java:41) java: at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) java: at java.util.concurrent.FutureTask.run(FutureTask.java:266) java: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) java: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) java: at java.lang.Thread.run(Thread.java:745) java: Errors occurred while compiling module 'Lambda' Compilation completed with 1 error and 0 warnings in 2 sec 1 error 0 warnings Error:java: Compilation failed: internal java compiler error 
+4
source share
3 answers

This is a known bug in the javac compiler. Either upgrade the compiler to version 1.8.0_40 (at least), or explicitly specify the argument types of lambda ( (Integer result, Person person) -> ... ).

+11
source

Although Tagir's answer answers your question more (about a compiler error), it is worth noting that there is a better way to code your solution, which is not only far cleaner and simpler, but will not encounter this error:

 int sumAge = personList.stream().mapToInt(Person::age).sum(); 
+2
source

Nice. You should probably raise a JDK error (but try the code with the latest version first). But the code does not do what you are trying to do. The tutorial provides an example of how to do this correctly: https://docs.oracle.com/javase/tutorial/collections/streams/reduction.html

There is no point in your code result += ... since this is a local parameter. And, I believe, the compiler is trying to make a conclusion about its type.

BTW, reduce takes only two arguments, and you provide three.

-one
source

All Articles