【问题标题】:java 10 compilaton Null Pointer Exceptionjava 10 编译空指针异常
【发布时间】:2018-06-16 05:49:21
【问题描述】:

我最近安装了 jdk10。我在做正常的代码,但它不工作。

我在这里做错了吗? 请查看代码和异常堆栈跟踪。 据我了解,这种行为应该没有理由。

import com.bean.College;

public class Student {

    interface Club {
        <T> T get(College<T> key);
    }

    private Club club;

    Student() {
        Object obj = club.get(new College<>() {});
    }
}

导入的College类是:

public class College<T> {
    int id;
    protected College() {
    }

    College(int id){
        this.id=id;
    }
} 

在编译时,javac 编译器会崩溃并显示以下堆栈跟踪:

java.lang.NullPointerException
        at jdk.compiler/com.sun.tools.javac.comp.Flow$FlowAnalyzer.visitApply(Flow.java:1233)
        at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept(JCTree.java:1634)
        at jdk.compiler/com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49)
        at jdk.compiler/com.sun.tools.javac.comp.Flow$BaseAnalyzer.scan(Flow.java:396)
        at jdk.compiler/com.sun.tools.javac.comp.Flow$FlowAnalyzer.visitVarDef(Flow.java:987)
        at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCVariableDecl.accept(JCTree.java:956)
        at jdk.compiler/com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49)
        at jdk.compiler/com.sun.tools.javac.comp.Flow$BaseAnalyzer.scan(Flow.java:396)
        at jdk.compiler/com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:57)
        at jdk.compiler/com.sun.tools.javac.comp.Flow$FlowAnalyzer.visitBlock(Flow.java:995)
        at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:1020)
        at jdk.compiler/com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49)
        at jdk.compiler/com.sun.tools.javac.comp.Flow$BaseAnalyzer.scan(Flow.java:396)
        at jdk.compiler/com.sun.tools.javac.comp.Flow$FlowAnalyzer.visitMethodDef(Flow.java:962)
        at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:866)
        at jdk.compiler/com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49)
        at jdk.compiler/com.sun.tools.javac.comp.Flow$BaseAnalyzer.scan(Flow.java:396)
        at jdk.compiler/com.sun.tools.javac.comp.Flow$FlowAnalyzer.visitClassDef(Flow.java:925)
        at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:774)
        at jdk.compiler/com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49)
        at jdk.compiler/com.sun.tools.javac.comp.Flow$BaseAnalyzer.scan(Flow.java:396)
        at jdk.compiler/com.sun.tools.javac.comp.Flow$FlowAnalyzer.analyzeTree(Flow.java:1325)
        at jdk.compiler/com.sun.tools.javac.comp.Flow$FlowAnalyzer.analyzeTree(Flow.java:1315)
        at jdk.compiler/com.sun.tools.javac.comp.Flow.analyzeTree(Flow.java:216)
        at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1393)
        at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1367)
        at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:965)
        at jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:306)
        at jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:165)
        at jdk.compiler/com.sun.tools.javac.Main.compile(Main.java:57)
        at jdk.compiler/com.sun.tools.javac.Main.main(Main.java:43) 

【问题讨论】:

  • 这不是我的主要功能。它是javac的主要功能。我的代码只有这么多。我只是用javac编译的。
  • 您在 Java 编译器中发现了一个错误。报告给 Oracle/OpenJDK。
  • 如果您仅将 Student 实例化为 new Student(),我能看到的当前代码中唯一的 NullPointerException 是 Object obj = club.get。另外,你能分享一下你如何编译上面的代码(java版本,IDE版本等)
  • 我已经使用来自 Oracle 的 javac 10.0.1 和您的源文件重现了您的崩溃。同意@JBNizet 的观点,您可以通过向 Oracle 报告来帮大家一个忙。即使您的程序中存在错误,编译器也不应该崩溃。
  • 感谢@Oleksandr 的报告。我的 javac 1.8.0_131 报告 reason: cannot use '&lt;&gt;' with anonymous inner classes 并且没有崩溃,所以似乎这个 bug 是在 Java 9 中引入的。

标签: java compiler-errors javac java-9 java-10


【解决方案1】:

这是一个报告的未解决的错误。该错误计划在 jdk 11 中解决。

JDK-8203195-匿名类类型推断导致 NPE

Type:                 Bug
Status:               In Progress
Priority:             P2
Resolution:           Unresolved
Affects Version/s:    9, 10, 10.0.1, 11
Fix Version/s:        11
Component/s:          tools
Labels:               dcsfai reproducer-yes webbug 

Subcomponent:         javac
CPU:                  generic   
OS:                   generic

https://bugs.openjdk.java.net/projects/JDK/issues/JDK-8203195?filter=allopenissues

但是,错误描述中提到了一种解决方法,其中指出:

有趣的是,将 A.java 更改为执行以下操作:
Object baz =&gt; foo.foo(new B&lt;Object&gt;() {});
或将 foo/B.java 更改为 以下:

 package foo;

 public class B<T> {

 B(int baz) {   }

 protected B() {   } 
 }

导致编译成功。

【讨论】:

    【解决方案2】:

    即使错误报告状态仍处于打开状态,使用 java 11 修复了我的问题

    【讨论】:

      【解决方案3】:

      我遇到了完全相同的错误,但找不到任何解决方案。即使我尝试使用 java 11 构建(有人说它已修复)它仍然失败并出现相同的错误。

      但错误只是误导。经过一些代码更改和重试(我删除了一些代码..),我发现实际的错误是一些缺少的库,我在类路径中添加了这些库并且构建成功!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-02
        相关资源
        最近更新 更多