使用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()获取的版本。