2015-10-01 20 views
2

我发现下面流想法。当我尝试分配的int流#减少操作,但是当整体出现内部Java编译器错误 - 不

的怪异行为让研究下面的代码:

int summaryAge = Person.getPersons().stream() 
       .parallel() //will return surprising result 
       .reduce(0, (intermediateResult, p) -> intermediateResult + p.age, 
         (ir1, ir2) -> ir1 + ir2); 

理念没有按”牛逼强调任何错误,但是当我运行应用程序,我看到下面的编译错误:

Error:java: Compilation failed: internal java compiler error 

但是当我更换使用Integer这样的:

Integer summaryAge = Person.getPersons().stream() 
        .parallel() //will return surprising result 
        .reduce(0, (intermediateResult, p) -> intermediateResult + p.age, 
          (ir1, ir2) -> ir1 + ir2); 

它工作正常。

型号:

public class Person { 

    String name; 

    Integer age; 
    ///... 

    public static Collection<Person> getPersons() { 
     List<Person> persons = new ArrayList<>(); 
     persons.add(new Person("Vasya", 12)); 
     persons.add(new Person("Petya", 32)); 
     persons.add(new Person("Serj", 10)); 
     persons.add(new Person("Onotole", 18)); 
     return persons; 
    } 
} 

它的想法或编译器的错误吗?

+1

你的代码第一个片段编译为我好(运行的javac 1.8.0_51与Maven) – Tunaki

+0

@Tunaki我用的想法。 http://dl2.joxi.net/drive/0005/3037/338909/151001/b29bd185b8.jpg – gstackoverflow

+0

看起来像我们使用相同版本的jdk – gstackoverflow

回答

3

我可以确认在从命令行启动编译器时,有一个有趣的问题似乎不会发生。我合并您的代码片段放到一个文件:

import java.util.ArrayList; 
import java.util.Collection; 
import java.util.List; 


public class Person { 

    String name; 

    Integer age; 
    ///... 

    Person(String n, int a) { 
     name=n; 
     age=a; 
    } 
    public static Collection<Person> getPersons() { 
     List<Person> persons = new ArrayList<>(); 
     persons.add(new Person("Vasya", 12)); 
     persons.add(new Person("Petya", 32)); 
     persons.add(new Person("Serj", 10)); 
     persons.add(new Person("Onotole", 18)); 
     return persons; 
    } 

    public static void main(String... arg) { 
     int summaryAge = Person.getPersons().stream() 
      .parallel() //will return surprising result 
      .reduce(0, (intermediateResult, p) -> intermediateResult + p.age, 
        (ir1, ir2) -> ir1 + ir2); 
    } 
} 

javac(1.8.0_60)在命令行编译它,不存在任何问题。当从我的NetBeans安装(8.0.2补丁2)相同的编译器,我得到

java.lang.NullPointerException 
    at com.sun.tools.javac.code.Types.isConvertible(Types.java:292) 
    at com.sun.tools.javac.comp.Check.assertConvertible(Check.java:933) 
    at com.sun.tools.javac.comp.Check.checkMethod(Check.java:887) 
    at com.sun.tools.javac.comp.Attr.checkMethod(Attr.java:4054) 
    at com.sun.tools.javac.comp.Attr.checkIdInternal(Attr.java:3826) 
    at com.sun.tools.javac.comp.Attr.checkMethodIdInternal(Attr.java:3733) 
    at com.sun.tools.javac.comp.Attr.checkMethodId(Attr.java:3710) 
    at com.sun.tools.javac.comp.Attr.checkId(Attr.java:3698) 
    at com.sun.tools.javac.comp.Attr.visitSelect(Attr.java:3581) 
    at com.sun.tools.javac.tree.JCTree$JCFieldAccess.accept(JCTree.java:1903) 
… 
相关问题