java.lang.NullPointerException هو واحد من أشهر الاستثناءات في برمجة جافا. يجب على أي شخص يعمل في جافا أن يكون قد رأى هذا المشكلة تظهر فجأة في البرنامج المستقل في جافا وكذلك في تطبيق الويب جافا.
java.lang.NullPointerException
NullPointerException هو استثناء تشغيلي، لذا لا يلزم أن نلتقطه في البرنامج. يتم رفع NullPointerException في التطبيق عندما نحاول القيام بعملية ما على null حيث يتطلب وجود كائن. بعض الأسباب الشائعة لحدوث NullPointerException في برامج جافا هي:
- استدعاء طريقة على مثيل كائن ولكن في وقت التشغيل يكون الكائن هو null.
- الوصول إلى متغيرات مثيل كائن تكون قيمته null في وقت التشغيل.
- رمي القيمة null في البرنامج
- الوصول إلى الفهرس أو تعديل قيمة الفهرس لمصفوفة تكون قيمتها null
- فحص طول مصفوفة تكون قيمتها null في وقت التشغيل.
أمثلة على Java NullPointerException
دعونا نلقي نظرة على بعض أمثلة على NullPointerException في برامج جافا.
1. NullPointerException عند استدعاء طريقة مثيل
عند تشغيل البرنامج أعلاه، يتم طرح رسالة خطأ NullPointerException التالية.
نحصل على NullPointerException في البيان t.foo("Hi");
لأن “t” هو قيمة فارغة هنا.
2. NullPointerException في جافا عند الوصول/تعديل حقل لكائن فارغ
البرنامج أعلاه يطرح سلسلة تعقب NullPointerException التالية.
يتم طرح NullPointerException في البيان int i = t.x;
لأن “t” هو قيمة فارغة هنا.
3. NullPointerException في جافا عند تمرير قيمة فارغة كوسيط في الطريقة
هذه واحدة من أكثر حالات حدوث java.lang.NullPointerException
شيوعًا لأنه المتصل الذي يمر بالوسيط الفارغ.
الصورة أدناه تظهر استثناء الإشارة الفارغة عند تنفيذ البرنامج أعلاه في بيئة Eclipse IDE.
4. java.lang.NullPointerException عندما يتم إلقاء القيمة الفارغة
أدناه هو تتبع استثناء الشريحة الناتج عن البرنامج أعلاه ، والذي يظهر NullPointerException بسبب البيان throw null;
.
5. NullPointerException عند الحصول على طول مجموعة فارغة
6. NullPointerException عند الوصول إلى قيمة الفهرس لمجموعة فارغة
7. استثناء NullPointerException عند المزامنة على كائن فارغ
ستقوم synchronized(mutex)
برمي استثناء NullPointerException لأن كائن “mutex” هو فارغ.
8. حالة HTTP 500 java.lang.NullPointerException
في بعض الأحيان نحصل على صفحة خطأ من تطبيق ويب جافا مع رسالة خطأ تظهر كـ “حالة HTTP 500 – خطأ في الخادم الداخلي” وسبب الجذر هو java.lang.NullPointerException
.
لهذا، قمت بتعديل مشروع Spring MVC Example وقمت بتغيير طريقة HomeController كما هو موضح أدناه.
تظهر الصورة أدناه رسالة الخطأ التي تم رميها بواسطة رد تطبيق الويب.
إليك تتبع الاستثناء:
السبب الجذري هو استثناء NullPointerException في البيان user.getUserId().toLowerCase()
لأن user.getUserId()
يعيد قيمة فارغة.
كيفية الكشف عن java.lang.NullPointerException
الكشف عن NullPointerException سهل جدًا، فقط انظر إلى تتبع الاستثناء وسوف يظهر لك اسم الفئة ورقم السطر للاستثناء. ثم انظر إلى الشفرة واعرف ما يمكن أن يكون قيمة فارغة تسبب NullPointerException. فقط انظر إلى جميع الأمثلة أعلاه، فمن الواضح جدًا من تتبع الاستثناء ما هو السبب في حدوث استثناء الفهرس الفارغ.
كيفية إصلاح NullPointerException
java.lang.NullPointerException هو استثناء غير مفحوص، لذا ليس علينا أن نقوم بالتقاطه. يمكن تجنب الاستثناءات المؤشر الفارغ باستخدام فحوصات القيمة الفارغة وتقنيات البرمجة الوقائية. انظر إلى أمثلة الشفرة أدناه التي توضح كيفية تجنب java.lang.NullPointerException
.
أفضل الممارسات في البرمجة لتجنب NullPointerException
1. لنُعتبر الدالة أدناه ونراقب السيناريو الذي يسبب استثناء مؤشر الصفر.
قد يحدث استثناء NullPointerException إذا تم تمرير الوسيط كقيمة فارغة. يمكن كتابة نفس الدالة كما يلي لتجنب استثناء NullPointerException.
2. يمكننا أيضًا إضافة فحص للقيمة الفارغة للوسيط ورمي IllegalArgumentException
إذا لزم الأمر.
3. يمكن استخدام المشغل الثلاثي كما هو موضح في مثال الكود أدناه.
4. استخدم String.valueOf()
بدلاً من الطريقة toString()
. على سبيل المثال، تحقق من كود طريقة PrintStream println() المعرفة كما هو موضح أدناه.
المقطع البرمجي أدناه يظهر مثالًا على استخدام طريقة valueOf() بدلاً من toString().
5. اكتب الطرق التي تعيد كائنات فارغة بدلاً من القيمة الفارغة في كل مكان إذا كان ذلك ممكنًا، على سبيل المثال، قائمة فارغة، سلسلة فارغة، وما إلى ذلك.
6. هناك بعض الطرق المعرفة في فصول الأدوات لتجنب استثناء NullPointerException، يجب استخدامها. على سبيل المثال contains()، containsKey()، و containsValue().
المرجع: وثائق الواجهة البرمجية للتطبيقات
Source:
https://www.digitalocean.com/community/tutorials/java-lang-nullpointerexception