使用Java Compiler API时出现空指针异常

时间:2010-03-30 07:20:23

标签: java nullpointerexception java-compiler-api

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。有人能告诉我代码有什么问题吗

6 个答案:

答案 0 :(得分:17)

我得到了同样的错误。也许我来不及回答这个问题,但我分享了自己的经验,这可能有助于其他人在未来面对同样的问题。我正在使用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

答案 1 :(得分:16)

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

我遇到了同样的问题

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

返回null。即使使用

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

返回null。

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

答案 4 :(得分:0)

它通过expicitily包括tools.jar来处理Java应用程序,但是Web应用程序无法正常工作。投掷Nullpointer

答案 5 :(得分:0)

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

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

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