使用 Java 编译器 API 时出现空指针异常
Posted
技术标签:
【中文标题】使用 Java 编译器 API 时出现空指针异常【英文标题】:Null Pointer Exception while using Java Compiler API 【发布时间】:2011-02-02 08:39:07 【问题描述】: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。谁能告诉我代码有什么问题
【问题讨论】:
你能用标签编辑你的代码吗? 那么你的问题是ToolProvider.getSystemJavaCompiler()
返回null?
【参考方案1】:
我怀疑您遇到了this problem - 使用 JRE 而不是 JDK 运行代码。
当您运行 SimpleCompileTest
时,尝试明确指定您正在使用的 java.exe 版本作为 JDK 目录中的版本。
【讨论】:
如何明确指定您使用的 Java.exe 版本作为 JDK 中的版本?我试过Run As
,但它已经Project JRE
被选为JRE
@Imray:我不确定你在问什么——如果那是选定的 JRE,那就会运行。如果您想要不同的,请选择不同的 JRE。听起来您需要针对您的确切问题提出一个新问题。
在您的回答中您说:“当您运行 SimpleCompileTest 时,请尝试明确指定您使用的 java.exe 版本作为 JDK 目录中的版本。”我在问,你是怎么做到的?
@Imray:我是说您配置的“JRE 项目”可能根本不是正确的。所以编辑那个配置。【参考方案2】:
您可能安装了 JRE 而不是 JDK。 http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6477844
【讨论】:
【参考方案3】:它通过明确包含 tools.jar 与 Java 应用程序一起使用,但对于 Web 应用程序不起作用。抛出空指针
【讨论】:
【参考方案4】:我遇到了同样的错误。也许我回答这个问题为时已晚,但我分享我自己的经验,它可能会帮助其他人在未来面临同样的问题。我在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
。
【讨论】:
你太棒了,亲爱的。你解决了我过去 3 周的问题。谢谢 我尝试这样做是为了让compilation-toolkit 工作。我必须使用System.setProperty("java.home", "C:\\Program Files\\Java\\jdk1.7.0_02\jre");
才能使其工作。【参考方案5】:
补充:上面的答案是在程序中设置 java.home 系统属性。这也适用于我,但这不是一个非常通用的解决方案,因为您已经为一个 jdk 版本进行了硬编码。我现在使用的替代方法是在运行程序时在命令行上提供“java”的完整路径。如(与上例一致):
C:\\Program Files\Java\jdk1.7.0_02\jre\bin\java -cp ..\classes path.to.program.myProgram
提供 jdk 版本的完整路径意味着这是运行程序的版本,因此将使用 ToolProvider.getSystemJavaCompiler() 获取该版本;
【讨论】:
【参考方案6】:我遇到了同样的问题
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
返回空值。即使在使用后
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 和项目的顶部。
这帮助我摆脱了 null 希望这对您也有帮助。快乐编译...:-)
【讨论】:
以上是关于使用 Java 编译器 API 时出现空指针异常的主要内容,如果未能解决你的问题,请参考以下文章