ما هو NullPointerException، وكيف يمكنني إصلاحه؟
-
03-07-2019 - |
سؤال
ما هي استثناءات المؤشر الفارغ (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
}
}
نصائح أخرى
وNullPointerException
s هي الاستثناءات التي تحدث عند محاولة استخدام مرجع يشير إلى أي مكان في الذاكرة (خالية) كما لو كانت الرجوع كائن. استدعاء الأسلوب على مرجع فارغة أو تحاول الوصول إلى حقل مرجع فارغة سيؤدي إلى 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
يتم طرح استثناء مؤشر فارغ عندما يحاول أحد التطبيقات استخدام قيمة فارغة في حالة طلب كائن.وتشمل هذه:
- استدعاء طريقة المثيل لـ a
null
هدف. - الوصول أو تعديل مجال أ
null
هدف. - أخذ طول
null
كما لو كانت مصفوفة. - الوصول إلى فتحات أو تعديلها
null
كما لو كانت مصفوفة. - رمي
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
ملخص:
- استخدم ال
final
المعدل لفرض التهيئة الجيدة. - تجنب إرجاع قيمة فارغة في الطرق، على سبيل المثال إرجاع المجموعات الفارغة عندما يكون ذلك ممكنًا.
- استخدم التعليقات التوضيحية
@NotNull
و@Nullable
- فشل سريعًا واستخدم التأكيدات لتجنب انتشار الكائنات الفارغة عبر التطبيق بأكمله عندما لا ينبغي أن تكون فارغة.
- استخدم يساوي مع كائن معروف أولاً:
if("knownObject".equals(unknownObject)
- يفضل
valueOf()
عبر toString (). - استخدام آمنة خالية
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، كل شيء (باستثناء الأنواع البدائية) يكون على شكل فئة.
إذا كنت تريد استخدام أي كائن، فلديك مرحلتان:
- يعلن
- التهيئة
مثال:
- تصريح:
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));
}