البرمجة

حل مشكلة NullPointerException في مقارنة مصفوفتين في Java

في البداية، يظهر أنك قامت بكتابة برنامج لمقارنة مصفوفتين ثنائية الأبعاد بحيث تكون متساويتين من حيث عدد الصفوف والأعمدة وقيم العناصر. لكنك واجهت مشكلة في تنفيذ البرنامج وظهور استثناء NullPointerException.

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

قمت بتكرار نفس الشرط في الجزء التالي من الشيفرة:

java
if ((arr1 == null && arr2 != null) || (arr1 == null && arr2 != null)) return false;

يجب أن يكون الشرط كالتالي:

java
if ((arr1 == null && arr2 != null) || (arr1 != null && arr2 == null)) return false;

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

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

المزيد من المعلومات

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

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

java
public static boolean equals(int[][] arr1, int[][] arr2) { if (arr1 == null && arr2 == null) return true; if ((arr1 == null && arr2 != null) || (arr1 != null && arr2 == null)) return false; if (arr1.length != arr2.length) return false; for (int i = 0; i < arr1.length; i++) { if (arr1[i] == null || arr2[i] == null || arr1[i].length != arr2[i].length) return false; for (int j = 0; j < arr1[i].length; j++) { System.out.println(i + "," + j); if (arr1[i][j] != arr2[i][j]) return false; } } return true; }

تحسين هذه الشيفرة يجعلها أكثر وضوحًا وأقل عرضة للأخطاء، مما يساعد في فهمها وصيانتها. يمكنك أيضاً استخدام عبارة Objects.deepEquals(arr1[i], arr2[i]) للمقارنة بين صفين، مما يسهل القراءة ويجعل الشيفرة أكثر أناقة.

مقالات ذات صلة

زر الذهاب إلى الأعلى

هذا المحتوى محمي من النسخ لمشاركته يرجى استعمال أزرار المشاركة السريعة أو تسخ الرابط !!