Java 8 компилятор вложенных лямбда-брейков - PullRequest
9 голосов
/ 12 июня 2019

У меня сложная проблема с Java 8.

Проблема

При сбое вложенного лямбда-компилятора с NullPointerException!

Я знаючто лямбды действительно должны быть лицами без состояния, в этом случае коды, имеющие состояние, являются реализациями Поставщика, которые, однако, являются анонимными классами, а не лямбдами.

Код

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;
                }
            };
        };
    };
}

Stacktrace

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).

Я пытался использовать CMD, используя mvn clean compile или через intelliJ, используя плагин maven.

Удаление функции C все работает нормально.


Мои предположения

гипотеза 1 Это ограничение Java 8, и в IntelliJ есть ошибка, которая позволяет мне свернуть анонимные классы влямбда, хотя java 8 не может их обработать.

гипотеза 2 Это ошибка Java 8.

Я спрашиваю унаша помощь для этого интересных проблем Java.Спасибо:)


ОБНОВЛЕНИЕ

Я открыл ошибку в Java Bug Database.Я подтверждаю, что это ошибка, и она была исправлена ​​в более поздней версии 9, 10, 11 и т. Д. *

https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8225771

1 Ответ

10 голосов
/ 12 июня 2019

Это ошибка компилятора Java 1 . Я могу воспроизвести его с помощью javac версии 1.8.0_212, запущенной из командной строки. (Никакие IDE не использовались ... или пострадали.)

Ошибка отсутствует в javac версии 10.0.1, поэтому обновление вашего инструментария до Java 11 решит проблему.


1 - Все, что приводит к сбою компилятора с NPE, является ошибкой!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...