2011-10-05 44 views
5

tôi đã nhận mã Java này từ một chủ đề Stack OverflowLập trình biên dịch java bằng 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()); 
    } 
} 

Nhưng tôi tiếp tục nhận một NullPointerException như thế này

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

không biên dịch nhưng nó ném ngoại lệ khi chạy. Tôi đang làm gì sai?

+1

Dòng nào là 'Main.java: 24'? 'ToolProvider.getSystemJavaCompiler()' có trả về null không? – mpartel

+0

Với mã chỉ dài 21 dòng, tôi không thể thấy NPE có thể xảy ra ở dòng 24. Có phải ý định của bạn là lãng phí thời gian của những người đang cố gắng giúp bạn? Bạn đang ** sử dụng mã nào? –

+0

@AndrewThompson Bạn có thể xem qua câu hỏi này không? http://stackoverflow.com/questions/36583278/how-can-compile-i-java-file-in-jsp – sony

Trả lời

5

Mã của bạn hoạt động tốt cho tôi khi tôi thực thi nó bằng cách sử dụng JDK. Nếu tôi thực hiện nó bằng cách sử dụng JRE tôi nhận được một NullPointerException trên compiler.run(...) như bạn.

Vì vậy, tôi giả định rằng bạn chỉ phải chuyển đổi thời gian chạy Java để thực thi mã của bạn.

+0

+1 Tôi nhận được kết quả tương tự – sealz

3

Bạn không thể biên dịch chương trình java bằng JRE.

Vì vậy, bạn phải có JDK trong đường dẫn để có thể biên dịch.

Trong trường hợp của bạn mà không cần chạy chương trình của bạn nếu bạn chạy trong dòng lệnh:
javac bạn sẽ nhận được

'javac' không được công nhận như là một lệnh nội bộ hay bên ngoài

này là lý do tại sao bạn nhận được ngoại lệ con trỏ null.

Các vấn đề liên quan