2010-03-30 3 views
10

MyClass.java:Исключение нулевого указателя при использовании Java Compiler API

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

+0

можете ли вы изменить свой код с помощью тегов? – bdhar

+2

Итак, ваша проблема в том, что 'ToolProvider.getSystemJavaCompiler()' возвращает null? – Gabe

ответ

16

Я подозреваю, что вы работаете в this problem - запускаете код с JRE вместо JDK.

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

+1

Как вы явно указываете версию Java.exe, которую используете в своем JDK? Я попробовал «Запустить как», но он уже «Проект JRE» выбран как JRE – CodyBugstein

+1

@Imray: я не уверен, что вы спрашиваете - если это выбранная JRE, это то, что будет работать. Если вы хотите другой, выберите другую JRE. Похоже, вам нужно задать новый вопрос с вашей * точной * проблемой. –

+1

В своем ответе вы говорите: «Когда вы запускаете SimpleCompileTest, попробуйте явно указать версию java.exe, которую вы используете, как тот, который находится в вашем каталоге JDK». Я спрашиваю, как вы это делаете? – CodyBugstein

0

Его работа с Java-приложением осуществляется с использованием инструментов tools.jar, но для веб-приложения не работает. Throwing Nullpointer

15

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

Я получал 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.

+0

Вы очень дорогие. вы решили мою проблему за последние 3 недели. спасибо –

+0

Я попробовал это, чтобы сделать [сборник-инструментарий] (https://code.google.com/p/compilation-toolbox/). Я должен был использовать 'System.setProperty (« java.home »,« C: \\ Program Files \\ Java \\ jdk1.7.0_02 \ jre »),' чтобы заставить его работать. –

+0

Это сработало и для меня! Спасибо Рашиду! – CodyBugstein

0

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

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

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

1

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

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); 

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

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

возвратил null.

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

Смежные вопросы