كيفية التعامل مع NullPointerException في جافا

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

java.lang.NullPointerException

تنشأ بعض قضايا الإنتاج الرئيسية بسبب NullPointerException. في هذه المقالة ، سنستعرض بعض الطرق للتعامل مع NullPointerExceptionJava.

فحص بسيط لاغ

ضع في اعتبارك الجزء التالي من الكود:

public static void main(String args[]) { String input1 = null; simpleNullCheck(input1); } private static void simpleNullCheck(String str1) { System.out.println(str1.length()); }

إذا قمت بتشغيل هذا الرمز كما هو ، فستحصل على الاستثناء التالي:

Exception in thread "main" java.lang.NullPointerException

سبب حصولك على هذا الخطأ هو أننا نحاول تنفيذ ملف length()العملية str1التي هي null.

حل سهل لذلك هو إضافة تحقق فارغ str1كما هو مبين أدناه:

private static void simpleNullCheck(String str1) { if (str1 != null) { System.out.println(str1.length()); } }

هذا سيضمن ذلك ، متى str1يكونnull، فأنت لا تقوم بتشغيل length()تعمل عليه.

لكن قد يكون لديك السؤال التالي.

ماذا لو كان str1 متغيرًا مهمًا؟

في هذه الحالة ، يمكنك تجربة شيء مثل هذا:

 private static void simpleNullCheck(String str1) { if (str1 != null) { System.out.println(str1.length()); } else { // Perform an alternate action when str1 is null // Print a message saying that this particular field is null and hence the program has to stop and cannot continue further. } }

الفكرة هي أنه عندما تتوقع قيمة ما null، فمن الأفضل أن nullتتحقق من هذا المتغير. وإذا تبين أن القيمة كذلك null، فاتخذ إجراءً بديلاً.

هذا لا ينطبق فقط على السلاسل ، ولكن على أي كائن آخر في Java.

فحص Lombok Null

الآن خذ المثال التالي:

public static void main(String args[]) { String input2 = "test"; List inputList = null; lombokNullCheck(input2, inputList, input2); } public static void lombokNullCheck(String str1, List strList, String str2) { System.out.println(str1.length() + strList.size() + str2.length()); }

هنا لدينا وظيفة أن يقبل ثلاث حجج: str1، strListو str2.

إذا تبين وجود أي من هذه القيم null، فنحن لا نريد تنفيذ المنطق في هذه الوظيفة على الإطلاق.

كيف يمكن تحقيق ذلك؟

هذا هو المكان الذي تصبح فيه لومبوك في متناول اليد. لإضافة مكتبة Lombok في التعليمات البرمجية الخاصة بك ، قم بتضمين تبعية Maven التالية:

  org.projectlombok lombok 1.18.12 provided 

لمعرفة المزيد حول Maven ، تحقق من هذه المقالة.

إليك ما سيبدو عليه الرمز مع nullفحص لومبوك :

public static void main(String args[]) { String input2 = "test"; List inputList = null; try { lombokNullCheck(input2, inputList, input2); } catch (NullPointerException e) { System.out.println(e); } } public static void lombokNullCheck(@NonNull String str1, @NonNull List strList, @NonNull String str2) { System.out.println(str1.length() + strList.size() + str2.length()); }

قبل كل وسيطة للدالة نضيفها @NonNullحاشية. ملاحظة.

أيضًا عندما نسمي هذه الوظيفة ، نضع try-catchكتلة حول استدعاء الوظيفة لالتقاطها NullPointerException.

إذا تبين أن أيًا من المعطيات الواردة في الدالة null، فستقوم الدالة برمي a NullPointerException. ثم يتم اكتشاف هذا بواسطة try-catchالكتلة.

هذا يضمن أنه ، إذا تبين أن أيًا من وسيطات الوظيفة null، فلن يتم تنفيذ المنطق في الوظيفة ونعلم أن الكود لن يتصرف بشكل غير عادي.

يمكن القيام بذلك باستخدام مجموعة من nullكشوف الشيكات أيضًا. لكن استخدام Lombok يساعدنا في تجنب كتابة العديد من nullكشوف الشيكات ويجعل الكود يبدو أكثر وضوحًا.

القوائم والأرقام الفارغة

لنفترض أن لديك قائمة وتريد طباعة جميع العناصر الموجودة في القائمة:

List stringList = new ArrayList(); stringList.add("ele1"); stringList.add("ele2"); if (stringList != null) { for (String element : stringList) System.out.println(element); }

قبل تكرار القائمة ، نحتاج إلى وضع علامة nullتحقق في القائمة.

إذا nullلم يكن الشيك موجودًا ، فستؤدي محاولة تكرار nullالقائمة إلى إلقاء ملف NullPointerException.

الخرائط والأرقام الفارغة

لنأخذ السيناريو حيث تحتاج إلى الوصول إلى قيمة مفتاح معين في الخريطة:

Map testMap = new HashMap(); testMap.put("first_key", "first_val"); if (testMap != null && testMap.containsKey("first_key")) { System.out.println(testMap.get("first_key")); }

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

بمجرد الانتهاء من ذلك ، تحقق من وجود مفتاح معين قبل الوصول إليه. يمكنك التحقق من وجود المفتاح باستخدام testMap.containsKey("first_key"). إذا لم يتم ذلك وكان المفتاح المعين غائبًا ، فستحصل على القيمة كـ null.

هل من الضروري إضافة "شيك فارغ" دائمًا؟

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

ولكن إذا لم تكن متأكدًا حقًا من بطلان الكائن ، فمن الأفضل إضافة nullفحص.

الشفرة

يمكن العثور على جميع الأكواد التي تمت مناقشتها في هذه المقالة في Github repo.

مبروك ؟

أنت الآن تعرف كيف تتعامل مع NullPointerExceptionجافا!

عن المؤلف

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

لا تتردد في قراءة المزيد من مقالاتي على مدونتي أو التواصل معي على LinkedIn أو متابعي على Twitter.