Java 8 个嵌套的 lambda 中断编译器
Java 8 nested lambdas break compiler
我对 Java 8.
有一个复杂的问题
问题
嵌套的 lambda 编译器崩溃 NullPointerException
!
我知道 lambda 确实必须是无状态的,在这种情况下,有状态的代码是供应商实现,但是是匿名的 类 而不是 lambda。
代码
import java.util.function.Function;
import java.util.function.Supplier;
public class Test {
public static Function<String, Supplier<String>> A = aVal -> new Supplier<String>() {
@Override
public String get() {
return B.apply(aVal).get();
}
private Function<String, Supplier<String>> B = bVal -> new Supplier<String>() {
@Override
public String get() {
return C.apply(bVal).get();
}
private Function<String, Supplier<String>> C = cVal -> new Supplier<String>() {
@Override
public String get() {
return cVal;
}
};
};
};
}
堆栈跟踪
An exception has occurred in the compiler (1.8.0_211). Please file a bug against the Java compiler via the Java bug reporting page (http://bugrepor
t.java.com) after checking the Bug Database (http://bugs.java.com) for duplicates. Include your program and the following diagnostic in your report
. Thank you.
java.lang.NullPointerException
at com.sun.tools.javac.jvm.Code.emitop0(Code.java:559)
at com.sun.tools.javac.jvm.Items$SelfItem.load(Items.java:367)
at com.sun.tools.javac.jvm.Gen.genArgs(Gen.java:966)
at com.sun.tools.javac.jvm.Gen.visitApply(Gen.java:1842)
at com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept(JCTree.java:1465)
at com.sun.tools.javac.jvm.Gen.genExpr(Gen.java:947)
at com.sun.tools.javac.jvm.Gen.visitAssign(Gen.java:1982)
at com.sun.tools.javac.tree.JCTree$JCAssign.accept(JCTree.java:1686)
at com.sun.tools.javac.jvm.Gen.genExpr(Gen.java:947)
at com.sun.tools.javac.jvm.Gen.visitExec(Gen.java:1781)
at com.sun.tools.javac.tree.JCTree$JCExpressionStatement.accept(JCTree.java:1296)
at com.sun.tools.javac.jvm.Gen.genDef(Gen.java:737)
at com.sun.tools.javac.jvm.Gen.genStat(Gen.java:772)
at com.sun.tools.javac.jvm.Gen.genStat(Gen.java:758)
at com.sun.tools.javac.jvm.Gen.genStats(Gen.java:809)
at com.sun.tools.javac.jvm.Gen.visitBlock(Gen.java:1157)
at com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:909)
at com.sun.tools.javac.jvm.Gen.genDef(Gen.java:737)
at com.sun.tools.javac.jvm.Gen.genStat(Gen.java:772)
at com.sun.tools.javac.jvm.Gen.genMethod(Gen.java:1031)
at com.sun.tools.javac.jvm.Gen.visitMethodDef(Gen.java:994)
at com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:778)
at com.sun.tools.javac.jvm.Gen.genDef(Gen.java:737)
at com.sun.tools.javac.jvm.Gen.genClass(Gen.java:2454)
at com.sun.tools.javac.main.JavaCompiler.genCode(JavaCompiler.java:745)
at com.sun.tools.javac.main.JavaCompiler.generate(JavaCompiler.java:1572)
at com.sun.tools.javac.main.JavaCompiler.generate(JavaCompiler.java:1536)
at com.sun.tools.javac.main.JavaCompiler.compile2(JavaCompiler.java:901)
at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:860)
at com.sun.tools.javac.main.Main.compile(Main.java:523)
at com.sun.tools.javac.api.JavacTaskImpl.doCall(JavacTaskImpl.java:129)
at com.sun.tools.javac.api.JavacTaskImpl.call(JavacTaskImpl.java:138)
at org.codehaus.plexus.compiler.javac.JavaxToolsCompiler.compileInProcess(JavaxToolsCompiler.java:125)
at org.codehaus.plexus.compiler.javac.JavacCompiler.performCompile(JavacCompiler.java:171)
at org.apache.maven.plugin.compiler.AbstractCompilerMojo.execute(AbstractCompilerMojo.java:886)
at org.apache.maven.plugin.compiler.CompilerMojo.execute(CompilerMojo.java:129)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:154)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:146)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:309)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:194)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:107)
at org.apache.maven.cli.MavenCli.execute(MavenCli.java:955)
at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:290)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:194)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)
测试
我用不同的版本(1.8.111、1.8.152、1.8.162、1.8.211)和不同的环境(Windows、Mac)做了几次尝试。
我尝试使用 mvn clean compile
使用 CMD 或使用 Maven 插件通过 intelliJ。
删除功能C
一切正常。
我的推测
假设一
这是一个 Java 8 限制,IntelliJ 有一个错误允许我将匿名 类 折叠成 lambda,尽管 java 8 无法处理它们。
假设2
这是一个 Java 8 错误。
我请求你帮助解决这个有趣的 java 问题。
谢谢:)
更新
我在 Java 错误数据库上打开了一个错误。我已经确认这是一个错误,它已在更高版本的 9、10、11 等中得到解决...
https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8225771
这是一个 Java 编译器错误1。我可以从命令行使用 javac
版本 1.8.0_212
运行 重现它。 (没有 IDE 被使用...或受到伤害。)
javac
版本 10.0.1
中不存在该错误,因此将您的工具链升级到 Java 11 将解决该问题。
1 - 任何导致编译器因 NPE 而崩溃的都是错误!
我对 Java 8.
有一个复杂的问题问题
嵌套的 lambda 编译器崩溃 NullPointerException
!
我知道 lambda 确实必须是无状态的,在这种情况下,有状态的代码是供应商实现,但是是匿名的 类 而不是 lambda。
代码
import java.util.function.Function;
import java.util.function.Supplier;
public class Test {
public static Function<String, Supplier<String>> A = aVal -> new Supplier<String>() {
@Override
public String get() {
return B.apply(aVal).get();
}
private Function<String, Supplier<String>> B = bVal -> new Supplier<String>() {
@Override
public String get() {
return C.apply(bVal).get();
}
private Function<String, Supplier<String>> C = cVal -> new Supplier<String>() {
@Override
public String get() {
return cVal;
}
};
};
};
}
堆栈跟踪
An exception has occurred in the compiler (1.8.0_211). Please file a bug against the Java compiler via the Java bug reporting page (http://bugrepor
t.java.com) after checking the Bug Database (http://bugs.java.com) for duplicates. Include your program and the following diagnostic in your report
. Thank you.
java.lang.NullPointerException
at com.sun.tools.javac.jvm.Code.emitop0(Code.java:559)
at com.sun.tools.javac.jvm.Items$SelfItem.load(Items.java:367)
at com.sun.tools.javac.jvm.Gen.genArgs(Gen.java:966)
at com.sun.tools.javac.jvm.Gen.visitApply(Gen.java:1842)
at com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept(JCTree.java:1465)
at com.sun.tools.javac.jvm.Gen.genExpr(Gen.java:947)
at com.sun.tools.javac.jvm.Gen.visitAssign(Gen.java:1982)
at com.sun.tools.javac.tree.JCTree$JCAssign.accept(JCTree.java:1686)
at com.sun.tools.javac.jvm.Gen.genExpr(Gen.java:947)
at com.sun.tools.javac.jvm.Gen.visitExec(Gen.java:1781)
at com.sun.tools.javac.tree.JCTree$JCExpressionStatement.accept(JCTree.java:1296)
at com.sun.tools.javac.jvm.Gen.genDef(Gen.java:737)
at com.sun.tools.javac.jvm.Gen.genStat(Gen.java:772)
at com.sun.tools.javac.jvm.Gen.genStat(Gen.java:758)
at com.sun.tools.javac.jvm.Gen.genStats(Gen.java:809)
at com.sun.tools.javac.jvm.Gen.visitBlock(Gen.java:1157)
at com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:909)
at com.sun.tools.javac.jvm.Gen.genDef(Gen.java:737)
at com.sun.tools.javac.jvm.Gen.genStat(Gen.java:772)
at com.sun.tools.javac.jvm.Gen.genMethod(Gen.java:1031)
at com.sun.tools.javac.jvm.Gen.visitMethodDef(Gen.java:994)
at com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:778)
at com.sun.tools.javac.jvm.Gen.genDef(Gen.java:737)
at com.sun.tools.javac.jvm.Gen.genClass(Gen.java:2454)
at com.sun.tools.javac.main.JavaCompiler.genCode(JavaCompiler.java:745)
at com.sun.tools.javac.main.JavaCompiler.generate(JavaCompiler.java:1572)
at com.sun.tools.javac.main.JavaCompiler.generate(JavaCompiler.java:1536)
at com.sun.tools.javac.main.JavaCompiler.compile2(JavaCompiler.java:901)
at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:860)
at com.sun.tools.javac.main.Main.compile(Main.java:523)
at com.sun.tools.javac.api.JavacTaskImpl.doCall(JavacTaskImpl.java:129)
at com.sun.tools.javac.api.JavacTaskImpl.call(JavacTaskImpl.java:138)
at org.codehaus.plexus.compiler.javac.JavaxToolsCompiler.compileInProcess(JavaxToolsCompiler.java:125)
at org.codehaus.plexus.compiler.javac.JavacCompiler.performCompile(JavacCompiler.java:171)
at org.apache.maven.plugin.compiler.AbstractCompilerMojo.execute(AbstractCompilerMojo.java:886)
at org.apache.maven.plugin.compiler.CompilerMojo.execute(CompilerMojo.java:129)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:154)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:146)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:309)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:194)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:107)
at org.apache.maven.cli.MavenCli.execute(MavenCli.java:955)
at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:290)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:194)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)
测试
我用不同的版本(1.8.111、1.8.152、1.8.162、1.8.211)和不同的环境(Windows、Mac)做了几次尝试。
我尝试使用 mvn clean compile
使用 CMD 或使用 Maven 插件通过 intelliJ。
删除功能C
一切正常。
我的推测
假设一 这是一个 Java 8 限制,IntelliJ 有一个错误允许我将匿名 类 折叠成 lambda,尽管 java 8 无法处理它们。
假设2 这是一个 Java 8 错误。
我请求你帮助解决这个有趣的 java 问题。 谢谢:)
更新
我在 Java 错误数据库上打开了一个错误。我已经确认这是一个错误,它已在更高版本的 9、10、11 等中得到解决...
https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8225771
这是一个 Java 编译器错误1。我可以从命令行使用 javac
版本 1.8.0_212
运行 重现它。 (没有 IDE 被使用...或受到伤害。)
javac
版本 10.0.1
中不存在该错误,因此将您的工具链升级到 Java 11 将解决该问题。
1 - 任何导致编译器因 NPE 而崩溃的都是错误!