2010-03-30 31 views
10

MyClass.java:Null pointer exception khi sử dụng Java Compiler API

package test; 
public class MyClass { 
    public void myMethod(){ 
     System.out.println("My Method Called"); 
    } 
} 

Liệt kê cho SimpleCompileTest.java rằng biên dịch các tập tin 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"); 
     } 
    } 
} 

Tôi đang thực hiện các lớp SimpleCompileTest và nhận được một NullPointerException. ToolProvider.getSystemJavaCompiler() trả về null. Ai đó có thể cho tôi biết điều gì sai với mã số

+0

bạn có thể vui lòng chỉnh sửa mã của mình bằng thẻ không? – bdhar

+2

Vì vậy, vấn đề của bạn là 'ToolProvider.getSystemJavaCompiler()' trả về null? – Gabe

Trả lời

16

Tôi nghi ngờ bạn đang chạy vào this problem - đang chạy mã bằng JRE thay vì JDK.

Khi bạn chạy SimpleCompileTest, hãy thử rõ ràng chỉ định phiên bản java.exe bạn đang sử dụng làm phiên bản trong thư mục JDK của mình.

+1

Làm cách nào để bạn chỉ định rõ phiên bản Java.exe bạn đang sử dụng làm phiên bản trong JDK của mình? Tôi đã thử 'Run As' nhưng nó đã được' Project JRE' được chọn là JRE – CodyBugstein

+1

@Imray: Tôi không chắc chắn những gì bạn đang hỏi - nếu đó là JRE đã chọn, đó là những gì sẽ chạy. Nếu bạn muốn một cái khác, hãy chọn một JRE khác. Có vẻ như bạn cần đặt một câu hỏi mới với vấn đề * chính xác * của mình. –

+1

Trong câu trả lời của bạn, bạn nói: "Khi bạn chạy SimpleCompileTest, hãy thử chỉ định rõ phiên bản java.exe bạn đang sử dụng làm phiên bản trong thư mục JDK của bạn." Tôi hỏi, làm thế nào để bạn làm điều đó? – CodyBugstein

0

Làm việc với ứng dụng Java bằng cách sử dụng đầy đủ các tools.jar nhưng đối với ứng dụng web không hoạt động. Ném Nullpointer

15

Tôi gặp lỗi tương tự. Có lẽ tôi đã quá muộn để trả lời câu hỏi này, nhưng tôi chia sẻ kinh nghiệm của riêng mình, nó có thể giúp người khác đối mặt với cùng một vấn đề trong tương lai. Tôi đang chơi với mã nguồn tại Compile Java Files At Runtime.

Tôi đã nhận được java.lang.NullPointerException như được đề cập. Tôi in ra thư mục nhà Java với System.out.println(System.getProperty("java.home"));, và nhận thấy Eclipse của tôi đã trỏ đến "C:\Program Files\Java\jre7" ngay cả sau khi tôi đã thay đổi các sở thích của mình để sử dụng JDK1.7 thay vì JRE1.7.

Tôi tìm thấy một workaround bằng cách buộc việc sử dụng JDK1.7 bằng cách thiết lập thuộc tính hệ thống như thế này:

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

Sau đó, tôi biên soạn chương trình của tôi và đã không nhận được bất kỳ NullPointerException.

+0

Bạn thật tuyệt vời. bạn đã giải quyết được vấn đề của tôi trong 3 tuần qua. cảm ơn –

+0

Tôi đã cố gắng làm cho [công cụ biên dịch-bộ công cụ] (https://code.google.com/p/compilation-toolbox/) hoạt động. Tôi đã phải sử dụng 'System.setProperty (" java.home "," C: \\ Program Files \\ Java \\ jdk1.7.0_02 \ jre ");' để làm cho nó hoạt động. –

+0

Điều này cũng phù hợp với tôi! Cảm ơn Rashid! – CodyBugstein

0

BỔ SUNG: Câu trả lời ở trên là đặt thuộc tính hệ thống java.home trong chương trình. Điều đó cũng làm việc cho tôi, nhưng nó không phải là một giải pháp rất chung chung, vì bạn đã mã hóa cứng cho một phiên bản jdk. Các thay thế mà tôi đang sử dụng bây giờ là để cung cấp cho các đường dẫn đầy đủ để "java" trên dòng lệnh khi tôi chạy chương trình. Chẳng hạn như (phù hợp với các ví dụ ở trên):

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

Cho đường dẫn đầy đủ lên phiên bản jdk có nghĩa đó là phiên bản đang chạy chương trình, vì vậy đó là một trong đó sẽ được lấy với ToolProvider.getSystemJavaCompiler();

1

Tôi đã có cùng một vấn đề

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); 

được trở về null. Ngay cả sau khi sử dụng

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

đã trả về giá trị rỗng.

Tuy nhiên, vấn đề rất đơn giản vì mã này nằm trong số Tools.jar được tìm thấy trong Java\jdk1.8.0_31\lib nếu bạn đang sử dụng JDK. những gì tôi đã làm là để đi đến project-->properties-->Java Build Path-->order and export--> và di chuyển tool.jar lên đầu các JRE và các dự án khác. Điều này đã giúp tôi loại bỏ hy vọng vô giá trị này cũng giúp bạn. Vui lòng biên dịch ... :-)

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