MyClass.java:

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

清单SimpleCompileTest.java该编译MyClass.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。谁能告诉我什么是错的代码

有帮助吗?

解决方案

我怀疑你正在运行到这个问题 - 运行与JRE代替JDK代码。

当你运行SimpleCompileTest,尝试的明确的规定的java.exe的版本,您正在使用作为一个在你的JDK目录。

其他提示

我得到了同样的错误。也许我来不及回答这个问题,但我分享我自己的经验,它可能会帮助别人面临着同样的问题在未来。我被玩弄的源代码在编译Java文件在运行时

我正java.lang.NullPointerException因为它被提及。我打印出来的Java主目录中System.out.println(System.getProperty("java.home"));,并注意到我的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

也许你有一个安装JRE,而不是JDK。 http://bugs.sun.com/bugdatabase/view_bug.do?bug_id= 6477844

我有同样的问题

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

被返回null。即使使用后

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

被返回空。

不过这个问题很简单,因为这代码是在Tools.jarJava\jdk1.8.0_31\lib发现,如果你使用的是JDK。我所做的就是去project-->properties-->Java Build Path-->order and export-->搬到tool.jar到其他JRE和项目的顶部。 这帮助我摆脱空希望这个帮助你well.Happy编译...: - )

及其与Java应用程序的工作由expicitily包括但的tools.jar为Web应用程序无法正常工作。投掷空指针

补充:上面的答案是在程序内设置java.home系统属性。这也为我的作品,但它不是一个非常通用的解决方案,因为你已经硬编码了一个JDK版本。另一种方法,我现在使用的是当我运行程序给予的完整路径在命令行上的“java”。如(与上述实施例一致):

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

给出完整路径JDK的版本的装置就是这样的运行程序的版本,所以这是一个将被获取与ToolProvider.getSystemJavaCompiler();

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top