JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
int results = compiler.run(null, null, null, "JavaProgramming.java");
出现java.lang.NullPointerException的错误,已经排查出就是在 int results = ......这句出错。调用代码是在jsp文件中写的,javaprogramming.java和jsp文件在同一目录下,java文件内容很简单,就是显示"hello",应该没有问题,为什么会是空指针错误呢?

解决方案 »

  1.   

    run
    int run(InputStream in,
            OutputStream out,
            OutputStream err,
            String... arguments)使用给定 I/O 通道和参数运行工具。按照惯例,工具如果运行成功,则返回 0;如果出现错误,则返回非 0 值。任何生成的诊断都将以某种未指定的格式写入 out 或 err。 参数:
    in - “标准”输入;如果为 null,则使用 System.in
    out - “标准”输出;如果为 null,则使用 System.out
    err - “标准”错误;如果为 null,则使用 System.err
    arguments - 要传递给工具的参数 
    返回:
    如果成功,则返回 0;否则返回非 0 值 
    抛出: 
    NullPointerException - 如果参数数组包含任何 null 元素。
      

  2.   

    按照文档,NullPointerException - 如果参数数组包含任何 null 元素。
    我测试了一下,如果找不到文件的话会提示找不到文件,不会抛异常.
    如果用文件的绝对目录,可以正确编译,不知道你的参数有什么问题.
      

  3.   

    测试代码:package test;import javax.tools.JavaCompiler;
    import javax.tools.ToolProvider;public class Main {    public static void main(String[] args) {
            // TODO code application logic here
            System.out.println("Hello World");
            JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
            compiler.run(null, null, null, "/home/superzxt/NetBeansProjects/Test/src/test/Hello.java");
        }
    }正常编译,运行之后会得到Hello.class文件.
      

  4.   

    不是 run 方法调用过程中抛出的 NullPointerException 异常,楼主试试 System.out.println(compiler); 看看打印出的是不是 null。
      

  5.   

    public static JavaCompiler getSystemJavaCompiler()
    获取此平台提供的 Java™ 编程语言编译器。
    返回:此平台提供的编译器;如果没有提供编译器,则返回 null
      

  6.   

    sagezk ,确实compiler为null那有什么办法吗?
      

  7.   

    getSystemJavaCompiler没用过不过javac还可以看看
    http://blog.csdn.net/sunyujia/archive/2008/05/02/2359194.aspx
      

  8.   

    把 JDK安装目录\lib\tools.jar 追加到 ClassPath 环境变量中试试。
      

  9.   

    我在文章中有提,貌似使用地址的方式都不起作用,看者甚微啊
    http://blog.csdn.net/sunyujia/archive/2008/05/02/2359194.aspx
      

  10.   

    我的也是compiler为空啊,怎么解决啊??
      

  11.   

    第一种方式: 
    String filePath = new File(CreateTest.class.getClassLoade().getResource("").getFile()).getAbsolutePath(); 
    String[] source = { "-d", path, new String("DynamicObject.java") }; 
            com.sun.tools.javac.Main.compile(source); 
    运行到最后一句的时候报错:无法读取?是什么原因啊?? 第二种方式: 
    String curDir = System.getProperty("user.dir"); 
    String path = curDir+"\\WEB-INF\\src\\factory\\DynamicObject.java"; 
            JavaCompiler compiler = (JavaCompiler) ToolProvider.getSystemJavaCompiler(); int results = ((Tool) compiler).run(null, null, null, path); 
    运行到最后抛出java.lang.NullPointerException 
    第三种方式: 
                      String curDir = System.getProperty("user.dir"); 
    String path = curDir+"\\WEB-INF\\src\\factory\\DynamicObject.java"; 
                      JavaCompiler jc = (JavaCompiler) ToolProvider.getSystemJavaCompiler(); 
    StandardJavaFileManager sjfm = jc.getStandardFileManager(null,null, null); 
    File javaFile = new File(path); 
    Iterable fileObjects = sjfm.getJavaFileObjects(javaFile); 
                    jc.getTask(null, sjfm, null, null, null, fileObjects).call(); 
            sjfm.close(); 
    抛出java.lang.NullPointerException 
      

  12.   

    这个问题我也遇到了,经过两天的摸索,发现在eclispe下将jre替换成jdk下面那个jre,程序就可以正常运行了
    ,由此可以知道应该是jre的问题,但是在windows麽有ide的情况下,我也不知道怎么解决,主要是不知道如何使程序运行在我们指定的jre中