2011-10-05 16 views
5

mam ten kod Java z innego wątku przepełnienie stosuProgramowo kompilować java z JavaCompiler?

import java.io.*; 
import javax.tools.JavaCompiler; 
import javax.tools.ToolProvider; 

public class Main { 
    public static void main(String[] args) throws IOException{ 
    String source = " public class Test { public static void main(String args[]) {  System.out.println(\"hello\"); } }"; 

    // Save source in .java file. 
    File root = new File("C:\\java\\"); 
    root.mkdir(); 
    File sourceFile = new File(root, "\\Test.java"); 
    Writer writer = new FileWriter(sourceFile); 
    writer.write(source); 
    writer.close(); 

    // Compile source file. 
    JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); 
    compiler.run(null, null, null, sourceFile.getPath()); 
    } 
} 

ale wciąż otrzymuję NullPointerException jak ten

Exception in thread "main" java.lang.NullPointerException 
    at com.zove.compiler.Main.main(Main.java:24) 

To robi kompilacji ale zgłasza wyjątek w czasie wykonywania. Co robię źle?

+1

Która linia to 'Main.java: 24'? Czy 'ToolProvider.getSystemJavaCompiler()' zwraca wartość null? – mpartel

+0

Biorąc pod uwagę, że kod ma tylko 21 linii, nie widzę, jak może wystąpić NPE w linii 24. Czy masz zamiar zmarnować czas osób próbujących ci pomóc? Który kod ** używasz **? –

+0

@AndrewThompson Czy możesz rzucić okiem na to pytanie? http://stackoverflow.com/questions/36583278/how-can-compile-i-java-file-in-jsp – sony

Odpowiedz

5

Twój kod działa dobrze dla mnie, gdy wykonuję go za pomocą JDK. Jeśli wykonam go za pomocą środowiska JRE, otrzymam wyjątek NullPointerException pod adresem compiler.run(...), taki jak Ty.

Dlatego zakładam, że do wykonania kodu wystarczy przełączyć środowisko wykonawcze Java.

+0

+1 Otrzymuję ten sam wynik – sealz

3

Nie można skompilować programów java za pomocą środowiska JRE.

Musisz więc mieć na swojej ścieżce JDK, aby kompilacja była możliwa.

W twoim przypadku nawet uruchomić program po uruchomieniu w wierszu poleceń:
javac dostaniemy

„javac” nie jest rozpoznawana jako polecenie wewnętrzne lub zewnętrzne

ten jest to, dlaczego otrzymujesz wyjątek wskaźnika pustego.

Powiązane problemy