Duplicate :
|
|
Duplicate :
|
|
Duplicate :
|
|
Duplicate :
|
|
Duplicate :
|
|
Relates :
|
FULL PRODUCT VERSION : java version "1.8.0_11" Java(TM) SE Runtime Environment (build 1.8.0_11-b12) Java HotSpot(TM) 64-Bit Server VM (build 25.11-b03, mixed mode) ADDITIONAL OS VERSION INFORMATION : Microsoft Windows [Version 6.1.7601] A DESCRIPTION OF THE PROBLEM : It might be related to JDK-8042741, however my problem still exists in jdk8u20 EA but exception is different. ADDITIONAL REGRESSION INFORMATION: The problem was first observed with EA builds of Java 8 (before official release of jdk8). I did not have clue what part of code it was but now I know. STEPS TO FOLLOW TO REPRODUCE THE PROBLEM : Compile attached code: javac TooMuchForACompiler.java EXPECTED VERSUS ACTUAL BEHAVIOR : EXPECTED - Code compiles successfully (or produces reasonable error message). ACTUAL - NullPointerException in a compiler ERROR MESSAGES/STACK TRACES THAT OCCUR : Error message for jdk8u11 (official release) java.lang.NullPointerException at com.sun.tools.javac.comp.Flow$AbstractAssignAnalyzer.trackable(Flow.java:1476) at com.sun.tools.javac.comp.Flow$AbstractAssignAnalyzer.visitVarDef(Flow.java:1801) at com.sun.tools.javac.comp.Flow$AssignAnalyzer.visitVarDef(Flow.java:2516) at com.sun.tools.javac.tree.JCTree$JCVariableDecl.accept(JCTree.java:846) at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49) at com.sun.tools.javac.comp.Flow$BaseAnalyzer.scan(Flow.java:389) at com.sun.tools.javac.comp.Flow$AbstractAssignAnalyzer.scan(Flow.java:1367) at com.sun.tools.javac.comp.Flow$AbstractAssignAnalyzer.visitLambda(Flow.java:2225) Error message for jdk8u20 EA: java.lang.NullPointerException at com.sun.tools.javac.code.Scope.includes(Scope.java:296) at com.sun.tools.javac.comp.Flow$1.trackable(Flow.java:247) at com.sun.tools.javac.comp.Flow$AbstractAssignAnalyzer.visitVarDef(Flow.java:1832) at com.sun.tools.javac.comp.Flow$AssignAnalyzer.visitVarDef(Flow.java:2569) REPRODUCIBILITY : This bug can be reproduced always. ---------- BEGIN SOURCE ---------- import java.util.function.Consumer; public class TooMuchForACompiler { public interface Supplier<T, E extends Exception> { T get() throws E; } public static <T, E extends Exception> T produceAndConsume(Supplier<T, E> supplier, Consumer<E> handler) { try { return supplier.get(); } catch (Exception e) { handler.accept((E) e); } return null; } public static void main(String... args) { produceAndConsume(() -> -1, i -> System.out.println(i.getMessage())); } } ---------- END SOURCE ---------- CUSTOMER SUBMITTED WORKAROUND : Assign one of lambdas to a variable. public static void main(String... args) { Supplier<Integer, RuntimeException> supplier = () -> -1; produceAndConsume(supplier, i -> System.out.println(i.getMessage())); }
|