سأعرض لك اليوم تقنيات بسيطة حول كيفية تجنب NullPointerException في تطبيقاتك. من السهل متابعتها، ولكنها تحسن بشكل كبير من موثوقية وجودة التعليمات البرمجية الخاصة بك. علاوة على ذلك، من خلال تجربتي، سيكون للنصيحة الأولى تأثير ملحوظ على جودة الكود الخاص بك. إذا كنت تعرف أي حيل أخرى لبرمجة Java، فلا تتردد في مشاركتها في التعليقات.
الاستخدام
هناك العديد من المكتبات مفتوحة المصدر التي تتحمل العبء الثقيل في اختبار حاول ألا تعود
هذه نصيحة جيدة أخرى لبرمجة Java يصفها جوشوا بلوخ في كتابه Java: البرمجة الفعالة. عند إرجاع مجموعات أو صفائف فارغة، تأكد من أن استدعاء الأساليب الأساسية مثل
استدعاء أساليب يساوي () و يساوي IgnoreCase () على سلسلة معروفة حرفيًا بدلاً من كائن غير معروف
قم دائمًا باستدعاء أسلوبequals()
على سلسلة معروفة تعرف أنها ليست كذلك null
. الطريقة equals()
متماثلة، أي أنها تستدعي a.equals(b)
وستعطي b.equals(a)
نفس النتيجة (إذا a
كان أو b
لا null
)، ولهذا السبب لا ينتبه العديد من المبرمجين إلى الكائنات التي يتم استدعاؤها equals()
، y a
أو y b
. أحد الآثار الجانبية لهذا هو NullPointerException إذا تم استدعاء الطريقة null
.
Object unknownObject = null;
//плохой способ - может вызвать NullPointerException
if(unknownObject.equals("knownObject")){
System.err.println("This may result in NullPointerException if unknownObject is null");
}
//правильный способ - исключение NullPointerException не возникнет, даже если unknownObject null
if("knownObject".equals(unknownObject)){
System.err.println("better coding avoided NullPointerException");
}
كانت هذه أبسط نصيحة لتجنب NullPointerException، لكنها وحدها تُحدث تحسنًا كبيرًا لأن الطريقة equals()
منتشرة في كل مكان.
اختر valueOf() بدلاً من toString() في الحالات التي ينتج فيها كلاهما نفس النتيجة
نظرًا لأن استدعاءtoString()
مرجع ذي قيمة null
يؤدي إلى NullPointerException، فمن الأفضل استخدام الاتصال valueOf()
عندما نتمكن من الحصول على نفس النتيجة، نظرًا لأن الاتصال valueOf()
من null
return null
. ينطبق هذا بشكل خاص على فئات المجمع مثل Integer
أو Float
أو . Double
BigDecimal
BigDecimal bd = getPrice();
System.out.println(String.valueOf(bd)); //не выбрасывает NPE
System.out.println(bd.toString()); //выбрасывает "Exception in thread "main" java.lang.NullPointerException"
استخدم هذه النصائح عندما لا تكون متأكدًا من إمكانية وجود الكائن null
أم لا.
الاستخدام null
- الأساليب والمكتبات الآمنة
هناك العديد من المكتبات مفتوحة المصدر التي تتحمل العبء الثقيل في اختبار null
. أحد أكثرها شيوعًا هو StringUtils
من Apache Commons. باستخدام أساليب مثل StringUtils.isBlank()
، isNumeric()
وما isWhiteSpace()
إلى ذلك. لا داعي للقلق بشأن طرح NullPointerException.
//Методы StringUtils являются null-безопасными, они не вызовут NullPointerException
System.out.println(StringUtils.isEmpty(null));
System.out.println(StringUtils.isBlank(null));
System.out.println(StringUtils.isNumeric(null));
System.out.println(StringUtils.isAllUpperCase(null));
الإخراج: true true false false ومع ذلك، قبل الاستخدام، لا تنس قراءة وثائق null
الطرق والفئات الآمنة. هذه واحدة أخرى من أفضل حيل Java التي تؤدي إلى تحسينات هائلة دون الحاجة إلى الكثير من الجهد.
حاول ألا تعود null
من إحدى الطرق، فمن الأفضل أن ترجع مجموعة فارغة
هذه نصيحة جيدة أخرى لبرمجة Java يصفها جوشوا بلوخ في كتابه Java: البرمجة الفعالة. عند إرجاع مجموعات أو صفائف فارغة، تأكد من أن استدعاء الأساليب الأساسية مثل size()
أو length()
لا يؤدي إلى NullPointerException. يعلن الفصل Collections
على وجه التحديد عن تطبيقات ملائمة للقوائم والمجموعات والقواميس الفارغة Collections.EMPTY_LIST
: Collections.EMPTY_SET
و Collections.EMPTY_MAP
. على سبيل المثال:
public List getOrders(Customer customer){
List result = Collections.EMPTY_LIST;
return result;
}
وبالمثل، يمكنك استخدامه Collections.EMPTY_SET
بدلاً Collections.EMPTY_MAP
من العودة null
.
استخدم التعليقات التوضيحية @NotNull و@Nullable
في وصف الطرق الخاصة بك، يمكنك تحديدnull
اصطلاحات سلامة الطريقة باستخدام التعليقات التوضيحية @NotNull
و@Nullable للإشارة إلى ما إذا كان يمكن للطريقة العودة null
أم لا. يمكن للمترجمين وبيئات التطوير المتكاملة (IDEs) الحديثة استخدام هذه التعليقات التوضيحية لتحليل التعليمات البرمجية الخاصة بك وتقديم النصائح المناسبة، على سبيل المثال، حول فقدان فحص لـ null
، أو العكس، حول إمكانية إزالة فحص غير ضروري يؤدي إلى انسداد التعليمات البرمجية. مثل هذه التعليقات التوضيحية، على سبيل المثال، مدعومة بواسطة IntelliJ IDE وFindBugs، وهي مدرجة أيضًا في JSR 305. ولكن حتى لو كان IDE الخاص بك لا يدعم مثل هذه التعليقات التوضيحية، فستكون توثيقًا جيدًا في حد ذاتها. بالنظر إلى @NotNull
ذلك، @Nullable
سيكون من الأسهل على المبرمج أن يفهم مكان إضافة الشيك null
وأين لا. هذه، بالمناسبة، ممارسة جديدة إلى حد ما بين مبرمجي جافا، وسوف يستغرق الأمر بعض الوقت حتى تنتشر.
تجنب التشغيل التلقائي والإلغاء التلقائي غير الضروريين في التعليمات البرمجية الخاصة بك
لا يؤدي هذا إلى إنشاء كائنات مؤقتة غير ضرورية فحسب، بل يمكن للعلبة التلقائية أيضًا طرح NullPointerException إذا كانت فئة الغلاف هيnull
. على سبيل المثال، ستطرح التعليمة البرمجية التالية NullPointerException إذا كان إدخال الشخص لا يحتوي على رقم هاتف ويقوم بإرجاع null
.
Person ram = new Person("ram");
int phone = ram.getPhone();
عند استخدام autoboxing أو autounboxing، ليس فقط المساواة، ولكن أيضًا عدم المساواة <
> >
يمكن أن يؤدي إلى NullPointerException.
اتبع الاتفاقيات وحدد الافتراضات المعقولة.
إحدى أفضل الطرق لتجنب NullPointerException في Java هي الإعلان عن اصطلاحات البرمجة ومتابعتها بشكل صحيح. تحدث معظم استثناءات NullPointerExceptions عند محاولة إنشاء كائن دون الحصول على كافة البيانات والتبعيات التي يتطلبها. من خلال منع إنشاء كائنات غير مكتملة عن طريق رفض مثل هذه الطلبات بأمان، ستنقذ نفسك من عدد كبير من NullPointerExceptions في المستقبل. وبالمثل، إذا سمحت بإنشاء الكائن، فيجب عليك اختيار قيمة افتراضية معقولة. على سبيل المثال، لا يمكن إنشاء كائن فئةEmployee
بدون اسم و id
، ولكن لا يجوز أن يحتوي على رقم هاتف. في هذه الحالة، Employee
قد تُرجع الكائنات التي لا تحتوي على أرقام صفرًا بدلاً من ذلك null
. على الرغم من أنه يجب التفكير مسبقًا في مثل هذا السلوك للكائن - فقد يكون التحقق منه أسهل null
من الاتصال برقم غير موجود. في هذه الحالة، فإن وجود شروط إضافية بشأن الحقول الموجودة null
وأيها غير موجودة سيساعد في اتخاذ القرار الصحيح. بشكل عام، يعد الاختيار بين إيقاف البرنامج فورًا أو تعيينه null
قرارًا تصميميًا مهمًا، وبمجرد قيامك بالاختيار، يجب عليك اتباعه باستمرار.
قم بتعيين القيود على مستوى نظام إدارة قواعد البيانات (DBMS).
عند استخدام قاعدة بيانات لتخزين كائنات برنامجك، مثل العملاء أو الطلبات، فمن الحكمة تحديد "null
طبيعة" كائناتك على مستوى نظام إدارة قواعد البيانات (DBMS)، باستخدام قيود الجدول المناسبة. غالبًا ما تحتوي قواعد البيانات على معلومات من مصادر متعددة، وسيعمل إجراء عمليات التحقق من القيم المفقودة على تحسين سلامة بياناتك. بالإضافة إلى ذلك، فإن وجود عمليات التحقق من القيمة الخالية على مستوى نظام إدارة قواعد البيانات (DBMS) سيؤدي إلى تقليلها في كود Java الخاص بك: عن طريق تحميل البيانات من قاعدة البيانات إلى كائنات Java، يمكنك التأكد من وجودها وإزالة " " غير الضرورية != null
من كود البرنامج.
استخدم نمط الكائن الفارغ
يعد إنشاءNull
كائنات خاصة طريقة أخرى لتجنب NullPointerExcpetion في Java. لنفترض أن بعض الطرق في تطبيقنا تُرجع كائنًا يعمل البرنامج معه لاحقًا عن طريق استدعاء أساليبه. على سبيل المثال، تقوم الطريقة Collection.iterator()
بإرجاع كائن من الفئة Iterator
المستخدمة للتكرار عبر المجموعة. ثم إذا لم يكن الكائن الأصلي يحتوي على أي مكرر، null
فيمكنك بدلاً من ذلك إرجاع Null
كائن - خاص له طريقة hasNext()
تُرجع دائمًا false
. هذا كل شيء عزيزي القارئ، وهنا أنهي نصائحي لتخليص برامج Java من أخطاء NullPointerException. سوف تقدر مدى فائدة هذه القواعد البسيطة وغير المرهقة. للتذكير، إذا كنت تريد مشاركة أي حيل أخرى لـ NullPointerException في برامج Java، فلا تتردد في القيام بذلك في التعليقات. تمت ترجمته خصيصًا لطلاب JavaRush. إبداعي
GO TO FULL VERSION