كيفية التعامل مع NullPointerException في جافا
إذا كنت قد قضيت بعض الوقت في تطوير برامج جافا ، فقد رأيت بالتأكيد الاستثناء التالي في مرحلة ما:
java.lang.NullPointerException
تنشأ بعض قضايا الإنتاج الرئيسية بسبب NullPointerException
. في هذه المقالة ، سنستعرض بعض الطرق للتعامل مع NullPointerException
Java.
فحص بسيط لاغ
ضع في اعتبارك الجزء التالي من الكود:
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.