Java / دليل حلول تحريري

تشخيص NullPointerException عند حد الملكية

حدد المرجع المفقود وسبب وصوله للعملية وأصلح العقد بدلاً من إضافة فحوص null غير مرتبطة.

وقت القراءة التقريبي: 3 دقيقةتاريخ مراجعة المحتوى

قاعدة معرفة للقراءة فقط · بلا تعليقات عامة

تعرّف على الأعراض

تظهر NullPointerException عند استدعاء أو حقل أو مصفوفة أو فك تغليف تلقائي. قد يتضمن السطر عدة وصولات فلا يثبت أقرب اسم أي قيمة null.

يتبع التفصيل الآلة والشيفرة الوسيطة. احفظ النص والمكدس الفعليين في تشخيص مقيد ولا تختلق رسالة تفصيل عامة أو تنشر بيانات شخصية.

افهم الأسباب المحتملة

  • قد يسمح العقد بغياب أو لا يجد البحث شيئاً أو تنقص التهيئة أو يفك تغليف null. وقد يفسد النشر أو التغيير المتزامن الثابت المفترض.
  • يخفي التقاط الاستثناء حول عملية كبيرة وإعلان النجاح الغياب المشروع والعيوب. يتبع الإصلاح مالك قرار الغياب.

حدد أول إطار تطبيقي والتعبير

طابق أول إطار تطبيقي بالنسخة المنشورة الدقيقة. قسّم تعبيراً مثل order.customer().name().trim() إلى قيم مسماة أثناء التشخيص وافحص الغياب دون طباعة كائنات أو أسرار. قد يضلل رقم سطر من بناء مختلف؛ سجّل هوية الأثر مع المكدس وأعد المشكلة بإدخال مصطنع معزول.

قرر هل الغياب صالح

إن سمح بالغياب فحدد فرعاً أو نتيجة اختيارية، وإن منع فارفضه عند الإنشاء أو التحليل بفشل واضح قبل العمل الجزئي. لا تستبدل مبلغاً مفقوداً بصفر أو عميلاً بكائن مختلق لتجنب الخطأ. تتبع منتج المرجع ومسؤوليته.

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

طبق إصلاحاً سياقياً

يحدد المثال غياب اسم العرض كـGuest بعقد منتج صريح لا توصية لكل حقل. يرفض الاسم المطلوب بدلاً من ذلك. تفيد Objects.requireNonNull للمتعاون المطلوب فتفشل قرب الإنشاء. عالج Integer المفقود قبل int؛ ولا يصلح تعديل قارئ آخر حد التحويل.

java سياسة اسم عرض اختياري صريحة
public class Main {

 public static void main(String[] args) throws Exception {
String name=null;
String display=name==null ? "Guest" : name.strip();
System.out.println(display);
 }
}
الناتج المتوقع
Guest

فرع null مقصود؛ ويتبع النص الخالي مساراً آخر يحتاج سياسته.

تجنب إخفاء كسر ثابت أعمق

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

تحقق من نجاح الإصلاح

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

امنع تكرار المشكلة

  • وثق المطلوب والاختياري في البواني والواجهات وفضّل الثبات واختبر الحدود. استخدم Optional لنتيجة مناسبة دون إرجاع null مكانها وحافظ على مطابقة الأثر والمصدر للتشخيص.

المراجع الرسمية