Исключение нулевого указателя при использовании API компилятора Java
-
23-09-2019 - |
Вопрос
МойКласс.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();