2011-10-05 8 views
5

Ho ottenuto questo codice Java da un altro thread Stack OverflowCompila java con JavaCompiler al livello di programmazione?

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()); 
    } 
} 

Ma io continuo a ricevere un NullPointerException come questo

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

E fa compilazione ma genera l'eccezione in fase di esecuzione. Cosa sto sbagliando?

+1

Quale riga è 'Main.java: 24'? 'ToolProvider.getSystemJavaCompiler()' restituisce null? – mpartel

+0

Dato che il codice è lungo solo 21 righe, non riesco a vedere come potrebbe verificarsi l'NPE alla riga 24. È tua intenzione sprecare il tempo delle persone che cercano di aiutarti? Che codice stai ** effettivamente ** usando? –

+0

@AndrewThompson Puoi dare un'occhiata a questa domanda? http://stackoverflow.com/questions/36583278/how-can-compile-i-java-file-in-jsp – sony

risposta

5

Il codice funziona correttamente per me quando lo eseguo utilizzando il JDK. Se lo eseguo utilizzando il JRE, ottengo una NullPointerException su compiler.run(...) come te.

Pertanto, presumo che sia necessario solo passare il runtime Java per l'esecuzione del codice.

+0

+1 Ottengo lo stesso risultato – sealz

3

Bene, non è possibile compilare i programmi java utilizzando JRE.

Quindi devi avere il JDK nel tuo percorso in modo che la compilazione sia possibile.

Nel tuo caso senza nemmeno l'esecuzione del programma se si esegue in linea di comando:
javac si otterrebbe

'javac' non è riconosciuto come comando interno o esterno

Questo è il motivo per cui ottieni l'eccezione del puntatore nullo.

Problemi correlati