سؤال

myclass.java:

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 والحصول على nullpointerxception. toolprovider.getSystemJavAcompiler () يعود فارغة. هل يمكن لأحد أن يخبرني ما هو الخطأ في الكود

هل كانت مفيدة؟

المحلول

أظن أنك تتجول هذه المشكلة - تشغيل الكود مع JRE بدلاً من JDK.

عند الركض SimpleCompileTest, ، محاولة صراحة تحديد إصدار Java.exe الذي تستخدمه كإصدار في دليل JDK الخاص بك.

نصائح أخرى

حصلت على نفس الخطأ. ربما تأخرت جدًا للإجابة على هذا السؤال ، لكنني أشارك تجربتي الخاصة ، فقد يساعد ذلك شخصًا آخر في مواجهة نفس القضية في المستقبل. كنت ألعب مع رمز المصدر في تجميع ملفات Java في وقت التشغيل.

كنت أحصل java.lang.NullPointerException كما ذكر. لقد طبعت دليل Java Home مع System.out.println(System.getProperty("java.home"));, ، ولاحظت أن الكسوف كان يشير إلى "C:\Program Files\Java\jre7"حتى بعد أن غيرت تفضيلاتي لاستخدام JDK1.7 بدلاً من JRE1.7.

لقد وجدت حلًا عن طريق إجبار استخدام JDK1.7 من خلال تعيين خاصية النظام مثل هذا:

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

ثم قمت بتجميع برنامجي ولم أحصل على أي شيء NullPointerException.

ربما يكون لديك JRE بدلاً من تثبيت JDK. http://bugs.sun.com/bugdatabase/view_bug.do؟bug_id=6477844

كانت لدي نفس المشكله

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

كان يعود فارغة. حتى بعد استخدام

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

كان يعود فارغة.

ومع ذلك ، كانت القضية بسيطة لأن هذا الرمز موجود في Tools.jar عثر عليه في Java\jdk1.8.0_31\lib إذا كنت تستخدم JDK. ما فعلته هو الذهاب إلى project-->properties-->Java Build Path-->order and export--> وانتقل tool.jar إلى قمة jre الأخرى والمشاريع. ساعدني ذلك في التخلص من Null Ask أن يساعدك هذا أيضًا.

تعمل مع تطبيق Java من خلال الناية بما في ذلك tools.jar ولكن لتطبيق الويب لا يعمل. رمي nullpointer

الملحق: الجواب أعلاه هو تعيين خاصية نظام java.home ضمن البرنامج. هذا يناسبني أيضًا ، لكنه ليس حلاً عامًا للغاية ، نظرًا لأنك مرمّنة برادة لإصدار JDK واحد. البديل الذي أستخدمه الآن هو إعطاء المسار الكامل لـ "Java" على سطر الأوامر عندما أقوم بتشغيل البرنامج. مثل (بما يتوافق مع الأمثلة أعلاه):

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

يعني إعطاء المسار الكامل لإصدار JDK أن هذا هو الإصدار الذي يدير البرنامج ، بحيث يتم جلبه باستخدام ToolProvider.getSystemJavAcompiler () ؛

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top