NullPointerException when type parameters are infered from method parameters

Thomas Jung thomas.andreas.jung at googlemail.com
Thu Aug 12 00:13:49 PDT 2010


Hi,

I tried to implement the method reference example given on the mailing
list and got a NullPointerException in the compiler. The first version
sortBy works. The second version throws the exception.

public static <T, U extends Comparable<? super U>> void sortBy(T[]
array, final Extractor<T, U> extractor) {
	Comparator<T> comparator = #(T left, T
right){extractor.get(left).compareTo(extractor.get(right)) };
	Arrays.sort(array, comparator);
}

		
public static <T, U extends Comparable<? super U>> void sortBy2(T[]
array, Extractor<T, U> extractor) {
	Comparator<T> comparator = #(left,
right){extractor.get(left).compareTo(extractor.get(right)) };
	Arrays.sort(array, comparator);
}


String[] input = {"ab", "a", "c", "ba", "afd", "b"};
Arrays2.sortBy(input, String#length);  //unstable sort by length
String[] expected = {"a", "c", "b", "ab", "ba", "afd"};
assertArrayEquals(input, expected);


java.lang.NullPointerException
	at com.sun.tools.javac.comp.Flow.visitApply(Flow.java:1194)
	at com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept(JCTree.java:1323)
	at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49)
	at com.sun.tools.javac.comp.Flow.scanStat(Flow.java:527)
	at com.sun.tools.javac.comp.Flow.visitLambda(Flow.java:1269)
	at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1479)
	at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49)
	at com.sun.tools.javac.comp.Flow.analyzeTree(Flow.java:1442)
	at com.sun.tools.javac.comp.Flow.analyzeLambda(Flow.java:1239)
	at com.sun.tools.javac.comp.Attr.attribLambda(Attr.java:2228)
	at com.sun.tools.javac.comp.Attr.inferLambda(Attr.java:2132)
	at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2081)
	at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1479)
	at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:434)
	at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:452)
	at com.sun.tools.javac.comp.Attr.attribExpr(Attr.java:456)
	at com.sun.tools.javac.comp.Attr.visitVarDef(Attr.java:846)
	at com.sun.tools.javac.tree.JCTree$JCVariableDecl.accept(JCTree.java:733)
	at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:434)
	at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:452)
	at com.sun.tools.javac.comp.Attr.attribStat(Attr.java:483)
	at com.sun.tools.javac.comp.Attr.attribStats(Attr.java:499)
	at com.sun.tools.javac.comp.Attr.visitBlock(Attr.java:877)
	at com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:789)
	at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:434)
	at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:452)
	at com.sun.tools.javac.comp.Attr.attribStat(Attr.java:483)
	at com.sun.tools.javac.comp.Attr.visitMethodDef(Attr.java:783)
	at com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:672)
	at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:434)
	at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:452)
	at com.sun.tools.javac.comp.Attr.attribStat(Attr.java:483)
	at com.sun.tools.javac.comp.Attr.attribClassBody(Attr.java:3608)
	at com.sun.tools.javac.comp.Attr.attribClass(Attr.java:3531)
	at com.sun.tools.javac.comp.Attr.attribClass(Attr.java:3467)
	at com.sun.tools.javac.comp.Attr.visitClassDef(Attr.java:664)
	at com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:601)
	at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:434)
	at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:452)
	at com.sun.tools.javac.comp.Attr.attribStat(Attr.java:483)
	at com.sun.tools.javac.comp.Attr.attribClassBody(Attr.java:3608)
	at com.sun.tools.javac.comp.Attr.attribClass(Attr.java:3531)
	at com.sun.tools.javac.comp.Attr.attribClass(Attr.java:3467)
	at com.sun.tools.javac.main.JavaCompiler.attribute(JavaCompiler.java:1129)
	at com.sun.tools.javac.main.JavaCompiler.compile2(JavaCompiler.java:849)
	at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:808)
	at com.sun.tools.javac.main.Main.compile(Main.java:409)
	at com.sun.tools.javac.main.Main.compile(Main.java:327)
	at com.sun.tools.javac.main.Main.compile(Main.java:318)
	at com.sun.tools.javac.Main.compile(Main.java:100)

Thomas


More information about the lambda-dev mailing list