使用JavaCompiler编译java文件,
总是在Compiler.java的compilationResult=compiler.run(null, null, err, fullQuanlifiedFileName)的这一行报错,不知道为什么?//Target.java
import java.util.Data;public class Target{
public void dosomething(){
Date date=new Date(10,3,3);
System.out.println("Done..");
}
}//Compiler.java
import javax.tools.*;
import java.io.FileOutputStream;public class Compiler {
  public static void main(String[] args) throws Exception {
    String fullQuanlifiedFileName = "E:/Target.java";     
    JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();    FileOutputStream err = new FileOutputStream("E:/err.txt");    int compilationResult = 0;
    compilationResult=compiler.run(null, null, err, fullQuanlifiedFileName);    if(compilationResult == 0){
      System.out.println("Done");
    } else {
      System.out.println("Fail");
    }
  }
}

解决方案 »

  1.   

    编译程序的时候 不会报NullPointerException吧 这个是运行时异常
      

  2.   

    compiler为null 或run函数里面调用了某个为null的变量的函数
    debug看一下吧
    哪里搞得JavaCompiler类?
      

  3.   

    没有详细错误信息只能猜一下把err换成null,不报错的话说明"E:/err.txt"不存在否则 E:/Target.java不存在其他不知道了
      

  4.   

    JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
    这个没取到你想取到的,为null~
      

  5.   

    刚刚看了一下JDK的源代码 找到了原因JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
    这行代码是去获得编译器对象 ,这个编译器类名: com.sun.tools.javac.api.JavacTool, 是在tools.jar 包里面 加载的时候,先搜索classpath然后用urlclassloader搜索但是因为这个jar不在classpath里面 而且也不在运行这个程序的jre的lib里面所以找不到 返回null解决方法很简单 把 你的 %JAVA_HOME%\lib\tools.jar 这个jar包 
    放到 运行java的jre下面,一般是在 C:\Program Files\Java\jre1.6.0下面 就可以l
    另外一个方法 直接把tools.jar加到Classpath里面  
      

  6.   

    我自己试了一下,不会报错呀,已经编译好了,在e盘下生成了相应的class文件,
    你自己在eclipse下调试一下执行过程就知道到底是哪个变量为null了,不是么
      

  7.   

    你是不是要自己编译类啊,如下,我试过,没问题:
    File[] files1 = {new File("E:\\yikatong\\ecard\\src\\ECardFrame.java"),new File("E:\\yikatong\\ecard\\src\\ECardApplication.java")};//指定要编译的类
    JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
    StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null); Iterable<? extends JavaFileObject> compilationUnits1 =
    fileManager.getJavaFileObjectsFromFiles(Arrays.asList(files1));
    compiler.getTask(null, fileManager, null, null, null, compilationUnits1).call();
    fileManager.close();
      

  8.   

    9楼正解。但为什么我把run(null,null,err,fullQuanlifiedFileName)的第一,二个参数,改为:
    FileInputStream in=new FileOutputStream("E:/in.txt");
    FileOutputStream out = new FileOutputStream("E:/out.txt");run(in,out,err,fullQuanlifiedFileName);调用之后,Target.java的输出字符串不是输出到E:/out.txt;而且也不是输出到控制台上呢?
      

  9.   

    run(in,out,err,fullQuanlifiedFileName)只是编译这个文件 并不是执行怎么会有输出呢