Исключение нулевого указателя при использовании API компилятора Java

StackOverflow https://stackoverflow.com/questions/2543439

Вопрос

МойКласс.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.Может кто-нибудь сказать мне, что не так с кодом

Это было полезно?

Решение

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

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

Другие советы

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

я получал java.lang.NullPointerException как это упоминается.Я распечатал домашний каталог Java с помощью System.out.println(System.getProperty("java.home"));, и заметил, что мое затмение указывало на "C:\Program Files\Java\jre7" даже после того, как я изменил свои предпочтения и стал использовать JDK1.7 вместо JRE1.7.

Я нашел обходной путь, принудительно используя JDK1.7, установив системное свойство следующим образом:

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

Затем я скомпилировал свою программу и не получил ничего NullPointerException.

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

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

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 и проектов.Это помогло мне избавиться от нулевой надежды, что это поможет и вам. Приятной компиляции...:-)

Он работает с Java-приложением, включая в него файл Tools.jar, но веб-приложение не работает.Выброс нулевого указателя

ДОБАВКА:Ответ выше — установить системное свойство java.home внутри программы.У меня это тоже работает, но это не очень общее решение, поскольку вы жестко запрограммировали одну версию jdk.Альтернатива, которую я использую сейчас, — указать полный путь к «java» в командной строке при запуске программы.Например (в соответствии с примерами выше):

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top