سؤال

ما هي استثناءات المؤشر الفارغ (java.lang.NullPointerException) وما أسبابها؟

ما الأساليب/الأدوات التي يمكن استخدامها لتحديد السبب حتى تتمكن من إيقاف الاستثناء من التسبب في إنهاء البرنامج قبل الأوان؟

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

المحلول

عندما تعلن عن متغير مرجعي (أي.كائن) أنت تقوم بالفعل بإنشاء مؤشر إلى كائن.خذ بعين الاعتبار التعليمة البرمجية التالية حيث تقوم بتعريف متغير من النوع البدائي int:

int x;
x = 10;

في هذا المثال المتغير x هو int وسوف تقوم Java بتهيئته 0 لك.عندما تقوم بتعيينها قيمة 10 في السطر الثاني، قيمة الخاص بك 10 يتم كتابته في موقع الذاكرة المشار إليه بواسطة x.

ولكن، عند محاولة إعلان مرجع يكتب, ، يحدث شيء مختلف.خذ الكود التالي:

Integer num;
num = new Integer(10);

يعلن السطر الأول عن متغير اسمه num, ، لكنها في الواقع لا تحتوي على قيمة بدائية حتى الآن.بدلاً من ذلك، فهو يحتوي على مؤشر (لأن النوع هو Integer وهو نوع مرجعي).نظرًا لأنك لم تقل بعد ما الذي تريد الإشارة إليه، فإن Java تقوم بتعيينه على null, ، وهو ما يعني "أنا أشير إلى لا شئ".

وفي السطر الثاني new يتم استخدام الكلمة الأساسية لإنشاء (أو إنشاء) كائن من النوع Integer ومتغير المؤشر num تم تكليفه بذلك Integer هدف.

ال NullPointerException يحدث عندما تعلن عن متغير ولكنك لم تقم بإنشاء كائن.إذن أنت تشير إلى شيء غير موجود في الواقع.

إذا حاولت إلغاء الإشارة num قبل إنشاء الكائن تحصل على NullPointerException.في الحالات الأكثر تافهة، سيكتشف المترجم المشكلة ويخبرك بذلك "num may not have been initialized"، ولكن في بعض الأحيان قد تكتب تعليمات برمجية لا تؤدي إلى إنشاء الكائن مباشرة.

على سبيل المثال، قد يكون لديك طريقة على النحو التالي:

public void doSomething(SomeObject obj) {
   //do something to obj
}

وفي هذه الحالة، لن تقوم بإنشاء الكائن obj, بل على افتراض أنه تم إنشاؤه قبل doSomething() تم استدعاء الطريقة .لاحظ أنه من الممكن استدعاء الطريقة على النحو التالي:

doSomething(null);

في أي حالة، obj يكون null.إذا كانت الطريقة تهدف إلى القيام بشيء ما بالكائن الذي تم تمريره، فمن المناسب رمي NullPointerException لأنه خطأ مبرمج وسيحتاج المبرمج إلى هذه المعلومات لأغراض التصحيح.

وبدلاً من ذلك، قد تكون هناك حالات حيث لا يكون غرض الأسلوب فقط هو العمل على الكائن الذي تم تمريره، وبالتالي قد تكون المعلمة الخالية مقبولة.في هذه الحالة، سوف تحتاج إلى التحقق من وجود معلمة فارغة وتتصرف بشكل مختلف.يجب عليك أيضًا شرح ذلك في الوثائق.على سبيل المثال، doSomething() يمكن كتابتها على النحو التالي:

/**
  * @param obj An optional foo for ____. May be null, in which case 
  *  the result will be ____.
  */
public void doSomething(SomeObject obj) {
    if(obj != null) {
       //do something
    } else {
       //do something else
    }
}

أخيراً، كيفية تحديد الاستثناء والسبب باستخدام Stack Trace

نصائح أخرى

وNullPointerExceptions هي الاستثناءات التي تحدث عند محاولة استخدام مرجع يشير إلى أي مكان في الذاكرة (خالية) كما لو كانت الرجوع كائن. استدعاء الأسلوب على مرجع فارغة أو تحاول الوصول إلى حقل مرجع فارغة سيؤدي إلى NullPointerException. هذه هي الأكثر شيوعا، ولكن ترد بطرق أخرى على NullPointerException الصفحة جافادوك.

وربما سيكون أسرع المثال رمز أتمكن من الخروج مع لتوضيح NullPointerException على النحو التالي:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

في السطر الأول داخل main، أنا صريح إعداد Object obj إشارة يساوي null. وهذا يعني لدي إشارة، ولكنه لا يشير إلى أي كائن. بعد ذلك، وأنا أحاول أن علاج الإشارة كما لو أنه يشير إلى كائن استدعاء أسلوب على ذلك. وهذا يؤدي إلى NullPointerException لأنه لا يوجد قانون لتنفيذ في الموقع الذي المرجع يتم الإشارة.

(وهذا هو فني، ولكن أعتقد أنه يحمل بالذكر: مرجع الذي يشير إلى فارغة ليست هي نفسها كمؤشر C الذي يشير إلى موقع ذاكرة غير صالح مؤشر فارغة حرفيا لا يشير <م> في أي مكان ، والتي تختلف بمهارة من الإشارة إلى الموقع الذي يحدث أن تكون غير صالحة).

ما هو NullPointerException؟

مكان جيد للبدء هو JavaDocs.لقد غطت هذا:

تم طرحه عندما يحاول التطبيق استخدام NULL في حالة يكون فيها كائن مطلوبًا.وتشمل هذه:

  • استدعاء أسلوب المثيل لكائن فارغ.
  • الوصول إلى أو تعديل حقل كائن فارغ.
  • أخذ طول القيمة الفارغة كما لو كانت مصفوفة.
  • الوصول إلى الفتحات الخالية أو تعديلها كما لو كانت مصفوفة.
  • رمي القيمة الفارغة كما لو كانت قيمة قابلة للرمي.

يجب أن ترمي التطبيقات مثيلات من هذه الفئة للإشارة إلى استخدامات غير قانونية أخرى للكائن الفارغ.

هذه هي الحالة أيضًا إذا حاولت استخدام مرجع فارغ مع synchronized, ، سيؤدي ذلك أيضًا إلى طرح هذا الاستثناء، لكل JLS:

SynchronizedStatement:
    synchronized ( Expression ) Block
  • بخلاف ذلك، إذا كانت قيمة التعبير فارغة، أ NullPointerException هذا خطئ.

كيف أصلحه؟

لذلك لديك NullPointerException.كيف يمكنك إصلاحه؟لنأخذ مثالاً بسيطًا يلقي NullPointerException:

public class Printer {
    private String name;

    public void setName(String name) {
        this.name = name;
    }

    public void print() {
        printString(name);
    }

    private void printString(String s) {
        System.out.println(s + " (" + s.length() + ")");
    }

    public static void main(String[] args) {
        Printer printer = new Printer();
        printer.print();
    }
}

تحديد القيم الخالية

الخطوة الأولى هي تحديد بالضبط القيم التي تسبب الاستثناء.لهذا، نحن بحاجة إلى القيام ببعض التصحيح.من المهم أن تتعلم القراءة أ تتبع المكدس.سيوضح لك هذا مكان طرح الاستثناء:

Exception in thread "main" java.lang.NullPointerException
    at Printer.printString(Printer.java:13)
    at Printer.print(Printer.java:9)
    at Printer.main(Printer.java:19)

هنا، نرى أن الاستثناء تم طرحه في السطر 13 (في ملف printString طريقة).انظر إلى السطر وتحقق من القيم الخالية من خلال الإضافة بيانات التسجيل أو باستخدام أ مصحح الأخطاء.نكتشف ذلك s فارغة، واستدعاء length الأسلوب عليه يلقي الاستثناء.يمكننا أن نرى أن البرنامج يتوقف عن طرح الاستثناء عندما s.length() تتم إزالته من الطريقة.

تتبع من أين تأتي هذه القيم

تحقق بعد ذلك من أين تأتي هذه القيمة.ومن خلال متابعة دعاة الطريقة نرى ذلك s يتم تمريره مع printString(name) في ال print() طريقة، و this.name باطل.

تتبع المكان الذي يجب تعيين هذه القيم فيه

أين هو this.name تعيين؟في ال setName(String) طريقة.مع مزيد من التصحيح، يمكننا أن نرى أن هذه الطريقة لم يتم استدعاؤها على الإطلاق.إذا تم استدعاء الطريقة، فتأكد من التحقق من طلب يتم استدعاء هذه الأساليب، ولا يتم استدعاء الأسلوب المحدد بعد طريقة الطباعة.

وهذا يكفي ليعطينا الحل:إضافة مكالمة إلى printer.setName() قبل الاتصال printer.print().

إصلاحات أخرى

يمكن أن يحتوي المتغير على القيمة الافتراضيةsetName يمكن منع تعيينه على قيمة فارغة):

private String name = "";

إما print أو printString يمكن الطريقة التحقق من وجود فارغة, ، على سبيل المثال:

printString((name == null) ? "" : name);

أو يمكنك تصميم الفصل بحيث name دائمًا ما يكون له قيمة غير فارغة:

public class Printer {
    private final String name;

    public Printer(String name) {
        this.name = Objects.requireNonNull(name);
    }

    public void print() {
        printString(name);
    }

    private void printString(String s) {
        System.out.println(s + " (" + s.length() + ")");
    }

    public static void main(String[] args) {
        Printer printer = new Printer("123");
        printer.print();
    }
}

أنظر أيضا:

ما زلت لا أستطيع العثور على المشكلة

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

سؤال:ما الذي يسبب أ NullPointerException (نبي)؟

كما تعلم، تنقسم أنواع جافا إلى أنواع بدائية (boolean, int, الخ) و أنواع المراجع.تسمح لك أنواع المراجع في Java باستخدام القيمة الخاصة null وهي طريقة جافا لقول "لا يوجد كائن".

أ NullPointerException يتم طرحه في وقت التشغيل عندما يحاول برنامجك استخدام ملف null كما لو كان مرجعا حقيقيا.على سبيل المثال، إذا كتبت هذا:

public class Test {
    public static void main(String[] args) {
        String foo = null;
        int length = foo.length();   // HERE
    }
}

سيحاول البيان المسمى "هنا" تشغيل الملف length() الطريقة على أ null مرجع، وهذا سوف يرمي NullPointerException.

هناك العديد من الطرق التي يمكنك من خلالها استخدام أ null القيمة التي ستؤدي إلى أ NullPointerException.في الواقع، الأشياء الوحيدة التي لك يستطيع افعل مع أ null دون التسبب في NPE هي:

  • قم بتعيينه إلى متغير مرجعي أو قراءته من متغير مرجعي،
  • قم بتعيينه إلى عنصر مصفوفة أو قراءته من عنصر مصفوفة (بشرط أن يكون مرجع المصفوفة نفسه غير فارغ!)
  • تمريرها كمعلمة أو إعادتها نتيجة لذلك، أو
  • اختباره باستخدام == أو != المشغلين، أو instanceof.

سؤال:كيف أقرأ تتبع مكدس NPE؟

لنفترض أنني قمت بتجميع وتشغيل البرنامج أعلاه:

$ javac Test.java 
$ java Test
Exception in thread "main" java.lang.NullPointerException
    at Test.main(Test.java:4)
$

الملاحظة الأولى:التجميع ينجح!المشكلة في البرنامج ليست خطأ في الترجمة.إنها مدة العرض خطأ.(قد تحذر بعض IDEs من أن برنامجك سيطرح دائمًا استثناءً ...ولكن المعيار javac المترجم لا.)

الملاحظة الثانية:عندما أقوم بتشغيل البرنامج، فإنه يخرج سطرين من "gobbledy-gook". خطأ!! هذا ليس gobbledy-gook.إنه عبارة عن مسار مكدس ...ويوفر معلومات حيوية سيساعدك ذلك على تعقب الخطأ في الكود الخاص بك، إذا أخذت الوقت الكافي لقراءته بعناية.

لذلك دعونا ننظر إلى ما يقول:

Exception in thread "main" java.lang.NullPointerException

يخبرك السطر الأول من تتبع المكدس بعدد من الأشياء:

  • يخبرك باسم سلسلة Java التي تم طرح الاستثناء فيها.بالنسبة لبرنامج بسيط بخيط واحد (مثل هذا)، سيكون "رئيسيًا".هيا لنذهب ...
  • يخبرك بالاسم الكامل للاستثناء الذي تم طرحه؛أي. java.lang.NullPointerException.
  • إذا كان الاستثناء يحتوي على رسالة خطأ مرتبطة، فسيتم إخراج ذلك بعد اسم الاستثناء. NullPointerException وهو أمر غير معتاد في هذا الصدد، لأنه نادرًا ما يحتوي على رسالة خطأ.

السطر الثاني هو الأهم في تشخيص NPE.

at Test.main(Test.java:4)

وهذا يخبرنا بعدة أمور:

  • يقول "في Test.main" أننا كنا في main طريقة Test فصل.
  • "Test.java:4" يعطي اسم الملف المصدر للفئة، ويخبرنا أن العبارة التي حدث فيها هذا موجودة في السطر 4 من الملف.

إذا قمت بعد السطور في الملف أعلاه، فإن السطر 4 هو الذي قمت بتسميته بالتعليق "هنا".

لاحظ أنه في مثال أكثر تعقيدًا، سيكون هناك الكثير من الخطوط في تتبع مكدس NPE.ولكن يمكنك التأكد من أن السطر الثاني (السطر الأول "at") سيخبرك بمكان إلقاء NPE1.

باختصار، سيخبرنا تتبع المكدس بشكل لا لبس فيه عن بيان البرنامج الذي ألقى NPE.

1- غير صحيح تماما.هناك أشياء تسمى الاستثناءات المتداخلة ...

سؤال:كيف يمكنني تعقب سبب استثناء NPE في الكود الخاص بي؟

هذا هو الجزء الصعب.الإجابة المختصرة هي تطبيق الاستدلال المنطقي على الأدلة المقدمة من خلال تتبع المكدس والكود المصدري ووثائق واجهة برمجة التطبيقات (API) ذات الصلة.

دعونا نوضح بالمثال البسيط (أعلاه) أولاً.نبدأ بالنظر إلى السطر الذي أخبرنا به تتبع المكدس حيث حدث NPE:

int length = foo.length(); // HERE

كيف يمكن أن رمي NPE؟

في الواقع هناك طريقة واحدة فقط:يمكن أن يحدث فقط إذا foo لديه القيمة null.ثم نحاول تشغيل length() طريقة على null و ....انفجار!

لكن (أسمعك تقول) ماذا لو تم إلقاء NPE داخل length() استدعاء الأسلوب؟

حسنًا، إذا حدث ذلك، فسيبدو تتبع المكدس مختلفًا.قد يشير السطر الأول "at" إلى أنه تم طرح الاستثناء في سطر ما في ملف java.lang.String الطبقة، والسطر 4 من Test.java سيكون السطر الثاني "في".

فأين فعل ذلك null يأتي من؟في هذه الحالة الأمر واضح، ومن الواضح ما يتعين علينا القيام به لإصلاحه.(قم بتعيين قيمة غير فارغة لـ foo.)

حسنًا، دعونا نجرب مثالًا أكثر صعوبة قليلًا.وهذا سوف يتطلب بعض خصم منطقي.

public class Test {

    private static String[] foo = new String[2];

    private static int test(String[] bar, int pos) {
        return bar[pos].length();
    }

    public static void main(String[] args) {
        int length = test(foo, 1);
    }
}

$ javac Test.java 
$ java Test
Exception in thread "main" java.lang.NullPointerException
    at Test.test(Test.java:6)
    at Test.main(Test.java:10)
$ 

والآن لدينا خطين "في".الأول لهذا السطر:

return args[pos].length();

والثاني لهذا السطر:

int length = test(foo, 1);

بالنظر إلى السطر الأول، كيف يمكن أن يؤدي ذلك إلى رمي NPE؟هناك طريقتان:

  • إذا كانت قيمة bar يكون null ثم bar[pos] سوف يرمي NPE.
  • إذا كانت قيمة bar[pos] يكون null ثم يدعو length() عليه سوف يرمي NPE.

بعد ذلك، نحتاج إلى معرفة أي من هذه السيناريوهات يفسر ما يحدث بالفعل.وسنبدأ بالتعرف على الأول:

أين bar يأتي من؟وهي معلمة ل test استدعاء الأسلوب، وإذا نظرنا إلى كيفية ذلك test تم استدعاؤه، يمكننا أن نرى أنه يأتي من foo متغير ثابت.بالإضافة إلى ذلك، يمكننا أن نرى بوضوح أننا قمنا بالتهيئة foo إلى قيمة غير فارغة.وهذا يكفي لرفض هذا التفسير مبدئيا.(من الناحية النظرية، هناك شيء آخر يمكن أن يحدث يتغير foo ل null ...ولكن هذا لا يحدث هنا.)

فماذا عن السيناريو الثاني لدينا؟حسنا، يمكننا أن نرى ذلك pos يكون 1, ، وهذا يعني ذلك foo[1] لا بد وأن null.هل هذا ممكن؟

بالتاكيد هو!وهذه هي المشكلة.عندما نقوم بالتهيئة هكذا:

private static String[] foo = new String[2];

نحن نخصص أ String[] مع عنصرين التي تتم تهيئتها ل null.وبعد ذلك لم نغير محتوياته foo ...لذا foo[1] ستظل null.

يبدو الأمر كما لو كنت تحاول الوصول إلى كائن موجود null.النظر في المثال أدناه:

TypeA objA;

في هذا الوقت لديك فقط أعلن هذا الكائن ولكن لا تهيئة أو إنشاء مثيل.وكلما حاولت الوصول إلى أي خاصية أو طريقة فيها، سيتم رميها NullPointerException وهو أمر منطقي.

انظر هذا المثال أدناه أيضًا:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown

يتم طرح استثناء مؤشر فارغ عندما يحاول أحد التطبيقات استخدام قيمة فارغة في حالة طلب كائن.وتشمل هذه:

  1. استدعاء طريقة المثيل لـ a null هدف.
  2. الوصول أو تعديل مجال أ null هدف.
  3. أخذ طول null كما لو كانت مصفوفة.
  4. الوصول إلى فتحات أو تعديلها null كما لو كانت مصفوفة.
  5. رمي null كما لو كانت قيمة Throwable.

يجب أن ترمي التطبيقات مثيلات هذه الفئة للإشارة إلى الاستخدامات غير القانونية الأخرى لـ null هدف.

مرجع: http://docs.Oracle.com/javase/8/docs/api/Java/lang/NullPointerException.html

ومؤشر null واحد هو أن يشير إلى أي مكان. عند dereference على p المؤشر، ويقول لك "أعطني البيانات الموجودة في الموقع المخزنة في" ص "، وعندما p هو مؤشر null، وموقع تخزينها في p هو nowhere، كنت تقول" أعطني البيانات في الموقع "في أي مكان". ومن الواضح، أنه لا يمكن القيام بذلك، لذلك يلقي null pointer exception.

في عام، لأن شيئا لم تتم تهيئة بشكل صحيح.

يوجد بالفعل الكثير من التفسيرات لشرح كيفية حدوث ذلك وكيفية إصلاحه، ولكن يجب عليك المتابعة أيضًا أفضل الممارسات لتجنب NullPointerException على الاطلاق.

أنظر أيضا:قائمة جيدة بأفضل الممارسات

وأود أن أضيف، وهو أمر مهم للغاية، الاستفادة الجيدة من final المعدل.استخدام المعدل "النهائي" كلما كان ذلك ممكنًا في Java

ملخص:

  1. استخدم ال final المعدل لفرض التهيئة الجيدة.
  2. تجنب إرجاع قيمة فارغة في الطرق، على سبيل المثال إرجاع المجموعات الفارغة عندما يكون ذلك ممكنًا.
  3. استخدم التعليقات التوضيحية @NotNull و @Nullable
  4. فشل سريعًا واستخدم التأكيدات لتجنب انتشار الكائنات الفارغة عبر التطبيق بأكمله عندما لا ينبغي أن تكون فارغة.
  5. استخدم يساوي مع كائن معروف أولاً: if("knownObject".equals(unknownObject)
  6. يفضل valueOf() عبر toString ().
  7. استخدام آمنة خالية StringUtils طُرق StringUtils.isEmpty(null).

وهناك استثناء مؤشر فارغة مؤشرا الذي تستخدمه كائن دون تهيئة عليه.

وعلى سبيل المثال، وفيما يلي فئة الطلاب التي سيتم استخدامها في التعليمات البرمجية لدينا.

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

ورمز أدناه يعطيك استثناء مؤشر فارغة.

public class School {

    Student student;

    public School() {
        try {
            student.getId();
        }
        catch(Exception e) {
            System.out.println("Null pointer exception");
        }
    }
}

ولأنك تستخدم student، ولكنك نسيت أن تهيئة عليه في الرمز الصحيح هو مبين أدناه:

public class School {

    Student student;

    public School() {
        try {
            student = new Student();
            student.setId(12);
            student.getId();
        }
        catch(Exception e) {
            System.out.println("Null pointer exception");
        }
    }
}

في Java، كل شيء (باستثناء الأنواع البدائية) يكون على شكل فئة.

إذا كنت تريد استخدام أي كائن، فلديك مرحلتان:

  1. يعلن
  2. التهيئة

مثال:

  • تصريح: Object object;
  • التهيئة: object = new Object();

نفس الشيء بالنسبة لمفهوم المصفوفة:

  • تصريح: Item item[] = new Item[5];
  • التهيئة: item[0] = new Item();

إذا كنت لا تعطي قسم التهيئة ثم NullPointerException تنشأ.

في جافا جميع المتغيرات قمت بتعريف هي في الواقع "المراجع" لل الكائنات (أو الأوليات) وليس الكائنات نفسها.

عند محاولة تنفيذ أسلوب كائن واحد، فإن الإشارة تطلب الكائن المعيشة لتنفيذ هذه الطريقة. ولكن إذا كانت الإشارة يتم الرجوع NULL (لا شيء، صفر، باطل، ندى) ثم لا توجد وسيلة يحصل تنفيذ الأسلوب. ثم وقت التشغيل تتيح لك معرفة ذلك عن طريق رمي NullPointerException.

مرجع الخاص بك هو "لافتا" لاغية، وبالتالي "لاغية -> مؤشر".

والكائن يعيش في مساحة الذاكرة VM والطريقة الوحيدة للوصول إلى أنه يستخدم إشارات this. خذ هذا المثال:

public class Some {
    private int id;
    public int getId(){
        return this.id;
    }
    public setId( int newId ) {
        this.id = newId;
    }
}

وعلى مكان آخر في التعليمات البرمجية:

Some reference = new Some();    // Point to a new object of type Some()
Some otherReference = null;     // Initiallly this points to NULL

reference.setId( 1 );           // Execute setId method, now private var id is 1

System.out.println( reference.getId() ); // Prints 1 to the console

otherReference = reference      // Now they both point to the only object.

reference = null;               // "reference" now point to null.

// But "otherReference" still point to the "real" object so this print 1 too...
System.out.println( otherReference.getId() );

// Guess what will happen
System.out.println( reference.getId() ); // :S Throws NullPointerException because "reference" is pointing to NULL remember...

وهذا شيء مهم أن يعرف - عندما لا يكون هناك المزيد من الإشارات إلى كائن (في المثال أعلاه عند reference وotherReference كل من نقطة إلى فارغة) ثم الكائن هو "غير قابلة للوصول". لا توجد وسيلة يمكننا العمل معها، لذلك هذا الكائن هو على استعداد ليكون القمامة التي تم جمعها، وعند نقطة ما، سوف VM تحرير الذاكرة المستخدمة من قبل هذا الكائن وسيتم تخصيص آخر.

ويحدث حدوث آخر من NullPointerException عندما يعلن احد مجموعة وجوه، ثم يحاول فورا لعناصر dereference داخل منه.

String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

في هذا NPE معين يمكن تجنبها إذا تم عكس ترتيب المقارنة. وهي استخدام .equals على كائن غير فارغة المضمون.

وجميع العناصر داخل مجموعة <لأ href = "http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.5" يختلط = "noreferrer "> يتم تهيئة إلى هم مشترك القيمة الأولية . لأي نوع من مجموعة وجوه، وهذا يعني أن جميع العناصر null.

أنت <م> يجب تهيئة العناصر في مجموعة <م> قبل الوصول أو dereferencing عليها.

String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top