【问题标题】:Java compiler projectJava编译器项目
【发布时间】:2013-03-30 21:08:35
【问题描述】:

我正在制作一个运行时会编译 Java 源文件的项目。

我遇到的问题是 StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnostics, null, null); 行抛出 NullPointerException。

谁能帮忙解决这个问题?

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();

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

System.out.println("Searching for scripts...");

File[] javaFiles = src.listFiles(new FilenameFilter() {
    public boolean accept(File src, String name) {
        return name.toLowerCase().endsWith(".java");
    }
});

Iterable<? extends JavaFileObject> compilationUnits = fileManager
        .getJavaFileObjectsFromFiles(Arrays.asList(javaFiles));

JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager,
        diagnostics, null, null, compilationUnits);

【问题讨论】:

  • 发布完整的堆栈跟踪。
  • 当 2/3 参数为空时,NPE 可能会被抛出也就不足为奇了......
  • @dantuch,他设置为null的参数是允许的。
  • 来自ToolProvider.getSystemJavaCompiler() 的Javadoc:**Returns:** the compiler provided with this platform or null if no compiler is provided。这可能是问题所在 - ToolProvider 不是很可靠,即使您知道您的系统上有编译器,ToolProvider 也找不到它并返回 null .
  • 另见STBC & 特别是(Class-path) Configuration。它使用JavaCompiler API & 自带源码。

标签: java compiler-construction compilation nullpointerexception


【解决方案1】:

来自getSystemJavaCompiler()JavaDoc

返回: 此平台提供的编译器,如果没有提供编译器,则为 null

不存在系统编译器的最可能原因是您在不提供编译器的 JRE(Java 运行时环境)中执行程序。尝试改用 JDK(Java 开发工具包)环境。

【讨论】:

  • 啊,我认为您是正确的,因为我在 Eclipse 中运行它并且没有更改该设置!如果我希望它适用于任何安装了 JDK 的机器,我是否需要编辑构建路径或其他东西?
  • @Ciphor 在 Eclipse 中有一些 .cfg 或 .ini 文件,其中指定了 java 路径。将其更改为指向 JDK。
  • @dantuch 如果我想让它与在许多机器上支持它的任何版本的 JDK 一起工作,那将无法解决我的问题。
  • 我已经弄清楚如何将特定的 JDK 添加到构建路径中,只是不确定如何为任何版本执行此操作。
猜你喜欢
  • 2016-03-07
  • 2014-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-23
  • 2018-11-05
相关资源
最近更新 更多