使用 Java 编译器 API 时出现空指针异常

Posted

技术标签:

【中文标题】使用 Java 编译器 API 时出现空指针异常【英文标题】:Null Pointer Exception while using Java Compiler API 【发布时间】:2011-02-02 08:39:07 【问题描述】:

MyClass.java:

package test;
public class MyClass 
    public void myMethod()
        System.out.println("My Method Called");
    

编译 MyClass.java 文件的 SimpleCompileTest.java 的列表。

SimpleCompileTest.java:

package test;
import javax.tools.*;
public class SimpleCompileTest 
    public static void main(String[] args) 
String fileToCompile = "test" + java.io.File.separator +"MyClass.java";
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
int compilationResult = compiler.run(null, null, null, fileToCompile);
        if(compilationResult == 0)
            System.out.println("Compilation is successful");
        else
            System.out.println("Compilation Failed");
        
    

我正在执行 SimpleCompileTest 类并获得 NullPointerException。 ToolProvider.getSystemJavaCompiler() 返回 null。谁能告诉我代码有什么问题

【问题讨论】:

你能用标签编辑你的代码吗? 那么你的问题是ToolProvider.getSystemJavaCompiler()返回null? 【参考方案1】:

我怀疑您遇到了this problem - 使用 JRE 而不是 JDK 运行代码。

当您运行 SimpleCompileTest 时,尝试明确指定您正在使用的 java.exe 版本作为 JDK 目录中的版本。

【讨论】:

如何明确指定您使用的 Java.exe 版本作为 JDK 中的版本?我试过Run As,但它已经Project JRE被选为JRE @Imray:我不确定你在问什么——如果那是选定的 JRE,那就会运行。如果您想要不同的,请选择不同的 JRE。听起来您需要针对您的确切问题提出一个新问题。 在您的回答中您说:“当您运行 SimpleCompileTest 时,请尝试明确指定您使用的 java.exe 版本作为 JDK 目录中的版本。”我在问,你是怎么做到的? @Imray:我是说您配置的“JRE 项目”可能根本不是正确的。所以编辑那个配置。【参考方案2】:

您可能安装了 JRE 而不是 JDK。 http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6477844

【讨论】:

【参考方案3】:

它通过明确包含 tools.jar 与 Java 应用程序一起使用,但对于 Web 应用程序不起作用。抛出空指针

【讨论】:

【参考方案4】:

我遇到了同样的错误。也许我回答这个问题为时已晚,但我分享我自己的经验,它可能会帮助其他人在未来面临同样的问题。我在Compile Java Files At Runtime 上玩弄源代码。

我收到了java.lang.NullPointerException,正如它所提到的。我用System.out.println(System.getProperty("java.home")); 打印出Java 主目录,并注意到我的Eclipse 指向“C:\Program Files\Java\jre7”,即使我将偏好更改为使用JDK1.7 而不是JRE1.7。

我找到了一种解决方法,通过设置系统属性来强制使用 JDK1.7:

System.setProperty("java.home", "C:\\Program Files\\Java\\jdk1.7.0_02");

然后我编译了我的程序并没有得到任何NullPointerException

【讨论】:

你太棒了,亲爱的。你解决了我过去 3 周的问题。谢谢 我尝试这样做是为了让compilation-toolkit 工作。我必须使用System.setProperty("java.home", "C:\\Program Files\\Java\\jdk1.7.0_02\jre"); 才能使其工作。【参考方案5】:

补充:上面的答案是在程序中设置 java.home 系统属性。这也适用于我,但这不是一个非常通用的解决方案,因为您已经为一个 jdk 版本进行了硬编码。我现在使用的替代方法是在运行程序时在命令行上提供“java”的完整路径。如(与上例一致):

C:\\Program Files\Java\jdk1.7.0_02\jre\bin\java -cp ..\classes path.to.program.myProgram

提供 jdk 版本的完整路径意味着这是运行程序的版本,因此将使用 ToolProvider.getSystemJavaCompiler() 获取该版本;

【讨论】:

【参考方案6】:

我遇到了同样的问题

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

返回空值。即使在使用后

System.setProperty("java.home", "C:\\Program Files\\Java\\jdk1.8.0_31");

正在返回 null。

但是问题很简单,因为如果您使用的是 JDK,则此代码位于 Java\jdk1.8.0_31\lib 中的 Tools.jar 中。我所做的是转到project-->properties-->Java Build Path-->order and export--> 并将tool.jar 移动到其他JRE 和项目的顶部。 这帮助我摆脱了 null 希望这对您也有帮助。快乐编译...:-)

【讨论】:

以上是关于使用 Java 编译器 API 时出现空指针异常的主要内容,如果未能解决你的问题,请参考以下文章

加载属性文件时出现空指针异常

使用 PDF 查看器库时出现空指针异常

Java + Android -> 开始新活动时出现空指针异常

HomeBaseFragment 运行时出现空指针异常

尝试开始新活动时出现空指针异常

尝试从 Apache Beam 中的选项获取值时出现空指针异常