interface工具的run()方法在JDK 9中抛出NullPointerException



//以下是你好.java文件。

public class Hello{
    public static void main(String... s){
        System.out.println("hello world");
    }
}

我正在尝试使用 Java 编译器 API 编译上述类,如下所示:

import javax.tools.*;
public class CallingJavaCompiler{
    public static void main(String... s){
        JavaCompiler comp = ToolProvider.getSystemJavaCompiler();
        int i = comp.run(System.in,System.out,System.err,"Hello.java");
        System.out.println(i);
    }
}

在执行 CallingJavaCompiler 类(使用 JDK 9(时,它会在 run 方法中抛出 java.lang.NullPointerException。我不明白为什么当有字符串类型参数时它会抛出异常?

这是我在执行它时得到的堆栈跟踪:

Exception in thread "main" java.lang.NullPointerException
    at CallingJavaCompiler.main(CallingJavaCompiler.java:5)

另一方面,除了执行相同的程序,即JDK 8中的调用JavaCompiler,它正在执行而没有任何运行时异常

请帮助我理解为什么当我使用 JDK 9 执行它时它会抛出空指针异常 (NPE(?

注意:我正在使用javac 9.0.4编译上述代码,并使用java版本9.0.4执行它。在使用这些版本编译和执行时,我得到了 NPE,但没有使用 JDK 8。

将 Hello.java 替换为 Hello.java 文件的完整路径(例如 C:\Test\Hello.java(。无论如何,即使通往Hello.java的路径是错误的,我也没有得到NullPointerException。

更新

我能够重现您的java.lang.NullPointerException错误。当使用 JRE 而不是 JDK 运行程序时,会出现它。这样,找不到编译器,因为编译器仅在 JDK 版本中可用。

UPDATE2

因此,您正在使用命令行来运行程序。

使用%jdk_home%/bin/java执行时,使用 JDK 执行时,使用 %jdk_home%/jre/bin/java 执行时,使用 JRE。

我看到您使用JDK 9.0.1编译并使用JRE 9.0.4运行。要使其正常工作,请执行如下操作:

%JDK 9.0.1 home%/bin/java CallingJavaCompiler

来自ToolProvider#getSystemJavaCompiler的文档:

此实现返回 jdk.compiler 模块提供的编译器(如果该模块可用(,否则返回 null。

我怀疑您的jdk.compiler模块由于某种原因不可用(您可能正在使用JRE 9而不是JDK 9运行该程序(,因此您会收到NullPointerException。 可以肯定的是,我建议将其添加到您的module-info.java,即使它似乎不是必需的。

module Hello {
    requires jdk.compiler;
}

无论如何,我能够通过提供Hello.java的完整路径来解决您的问题,如下所示。 这适用于 Windows;如果您使用任何其他操作系统,则应使用 File.separatorSystem.getProperty("file.separator") 而不是 \ .

JavaCompiler comp = ToolProvider.getSystemJavaCompiler();
int i = comp.run(System.in, System.out, System.err,"src\main\java\Hello.java");
System.out.println(i);

输出:

0

注意:路径从项目的根目录(源文件夹的父目录,src (开始。 请记住在必要时通过附加到目录来包含任何包。

相关内容

  • 没有找到相关文章

最新更新