使用Java编译器API时的空指针exception

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

我怀疑你遇到了这个问题 – 用JRE而不是JDK运行代码。

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

我得到了同样的错误。 也许我为时太晚回答这个问题,但我分享自己的经验,可能会帮助别人面对同样的问题。 我正在运行时编译Java文件的源代码。

正如所提到的,我得到了java.lang.NullPointerException 。 我用System.out.println(System.getProperty("java.home"));打印出Java主目录System.out.println(System.getProperty("java.home")); ,并且注意到我的Eclipse甚至在改变了我的首选项来使用JDK1.7而不是JRE1.7之后指向“ C:\Program Files\Java\jre7 ”。

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

 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"); 

返回null。

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

它的工作与Java应用程序通过包括tools.jar,但Web应用程序无法正常工作。 投掷Nullpointer

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

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

给出jdk版本的完整path意味着这是运行程序的版本,所以这是使用ToolProvider.getSystemJavaCompiler()获取的版本。