Исключение нулевого указателя при использовании API компилятора Java - PullRequest
11 голосов
/ 30 марта 2010

MyClass.java:

package test;
public class MyClass {
    public void myMethod(){
        System.out.println("My Method Called");
    }
}

Список SimpleCompileTest.java, который компилирует файл MyClass.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. Может кто-нибудь сказать мне, что не так с кодом

Ответы [ 6 ]

17 голосов
/ 08 июня 2012

Я получил ту же ошибку. Может быть, я слишком поздно отвечаю на этот вопрос, но я делюсь своим собственным опытом, это может помочь кому-то еще столкнуться с той же проблемой в будущем. Я играл с исходным кодом на Компиляция файлов Java во время выполнения .

Я получил java.lang.NullPointerException, как упоминалось. Я распечатал домашний каталог Java с System.out.println(System.getProperty("java.home")); и заметил, что мой 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.

16 голосов
/ 30 марта 2010

Я подозреваю, что вы сталкиваетесь с этой проблемой - запустите код с JRE вместо JDK.

Когда вы запускаете SimpleCompileTest, попробуйте явно , указав версию java.exe, которую вы используете в качестве той, которая находится в вашем каталоге JDK.

1 голос
/ 10 марта 2015

У меня была такая же проблема

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

возвращал ноль. Даже после использования

System.setProperty("java.home", "C:\\Program Files\\Java\\jdk1.8.0_31");

возвращал ноль.

Однако проблема была проста, поскольку этот код находится в Tools.jar, найденном в Java\jdk1.8.0_31\lib, если вы используете JDK. я перешел на project-->properties-->Java Build Path-->order and export--> и переместился tool.jar на вершину других JRE и проектов. Это помогло мне избавиться от нуля, надеюсь, это поможет и вам. Счастливая компиляция ...: -)

1 голос
/ 30 марта 2010

Возможно, у вас установлена ​​JRE вместо JDK. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6477844

0 голосов
/ 22 августа 2014

ДОПОЛНЕНИЕ: Ответ выше - установить системное свойство java.home в программе. Это работает и для меня, но это не очень общее решение, поскольку вы жестко запрограммированы для одной версии JDK. Альтернативой, которую я сейчас использую, является указание полного пути к «java» в командной строке при запуске программы. Например (в соответствии с примерами выше):

C:\\Program Files\Java\jdk1.7.0_02\jre\bin\java -cp ..\classes path.to.program.myProgram

Если указать полный путь к версии jdk, это означает, что это версия, в которой выполняется программа, поэтому она будет выбираться с помощью ToolProvider.getSystemJavaCompiler ();

0 голосов
/ 29 февраля 2012

Работает с Java-приложением, в том числе и с tools.jar, но для веб-приложения не работает Метание нулевого указателя

...