空指针异常而使用Java编译器API
-
23-09-2019 - |
题
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.jar
在Java\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();