【问题标题】:Nullpointerexception error when using JavaCompiler使用 JavaCompiler 时出现 Nullpointerexception 错误
【发布时间】:2013-08-10 06:30:18
【问题描述】:

以下是用eclipse ide编写的Java代码...

package compile;

import java.io.IOException;
import java.util.Arrays;
import javax.tools.DiagnosticCollector;
import javax.tools.JavaCompiler;
import javax.tools.JavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;

public class Execute {
    public static void main(String args[]) throws IOException, ClassNotFoundException {
        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
        DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();
        StandardJavaFileManager fileManager = compiler.getStandardFileManager(
                diagnostics, null, null);
        Iterable<? extends JavaFileObject> compilationUnits = fileManager
                .getJavaFileObjectsFromStrings(Arrays
                        .asList("F:\\practice java\\project\\KeepingMoreKidsQuiet.java"));
        JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager,
                diagnostics, null, null, compilationUnits);
        boolean success = task.call();

        System.out.println(success);
        if(!success)
            System.out.println(diagnostics.getDiagnostics());
        fileManager.close();
    }
}

当我运行我的 Java 程序时,它在这一行给我一个错误

StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnostics, null, null);

我得到的错误是:

线程“main”中的异常 java.lang.NullPointerException 在 compile.Execute.main(Execute.java:17)

你能告诉我如何解决这个错误吗?

【问题讨论】:

  • 编译器为空?来自 ToolProvider.getSystemJavaCompiler() 的 api 文档“此平台提供的编译器,如果没有提供编译器,则为 null”
  • 您是否使用调试器单步执行?您可以看到哪个对象为空,并试图找出原因。我的赌注是ToolProvider.getSystemJavaCompiler(); 返回null,但请确保。

标签: java nullpointerexception


【解决方案1】:

可能你的编译器引用在这一行为空JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

尝试在 PATH 的开头设置 %JAVA_HOME%\bin

【讨论】:

  • 你的编译器对象为空? object 不能为空。变量可以有一个null 值。
  • 您可以将null 本身视为一个可以被变量引用的特殊隐喻对象。甚至还有 Void 类来表示它。
【解决方案2】:

来自ToolProvider.getSystemJavaCompiler()

返回:

此平台提供的编译器null,如果没有提供编译器

【讨论】:

  • 我怎样才能摆脱这个?
  • @SuUbha 见this
【解决方案3】:

你的compiler 是空的,就像设计 ocd 评论一样:不要在你的 main 方法中做所有这些工作。充分利用 methodsclasses

【讨论】:

  • 谢谢大家..问题解决了...这是因为 Eclipse IDE 指向 jre...我使用以下代码将其更改为 JDK: System.setProperty("java .home", "C:\\Program Files\\Java\\jdk1.7.0_02");在 main() 函数中使用...
【解决方案4】:

您很可能使用JRE 而不是JDK 运行您的程序。 ToolProvider 只有在使用 JDK 运行时才能提供编译器。

This is the expected behavior

【讨论】:

    【解决方案5】:

    这通常发生在您使用 JRE 而不是 JDK 运行程序时。

    IDE 像 Eclipse 检测 JRE 路径并将其设置为 Java 程序的运行路径。如果您使用的是 Eclipse,则在 Build Path 中使用 JDK 路径设置新 VM(默认使用 JRE 路径)

    如果您直接从命令提示符运行,请检查您的类路径。

    【讨论】:

      猜你喜欢
      • 2014-06-21
      • 2015-05-09
      • 1970-01-01
      • 1970-01-01
      • 2021-01-25
      • 2013-12-29
      • 2013-12-19
      • 2022-01-19
      • 2013-04-13
      相关资源
      最近更新 更多