استثناء المؤشر الفارغ في جافا
NullPointerException في Java هو RuntimeException. ويحدث ذلك عندما يحاول أحد البرامج استخدام مرجع كائن له القيمة الخالية. في Java، تعد القيمة "null" قيمة خاصة يمكن تعيينها لمراجع الكائنات للإشارة إلى عدم وجود قيمة.
أسباب استثناء المؤشر الفارغ
يحدث NullPointerException للأسباب التالية:
- استدعاء طريقة من كائن فارغ.
- الوصول إلى أو تعديل حقل كائن فارغ.
- أخذ طول القيمة الفارغة كما لو كانت مصفوفة.
- الوصول إلى فتحات الكائنات الفارغة أو تعديلها كما لو كانت مصفوفة.
- رمي القيمة الفارغة كما لو كانت قيمة قابلة للرمي.
- عند محاولة المزامنة عبر كائن فارغ.
مثال:
Java public class Geeks { public static void main ( String [] args ) { // Reference set to null String s = null ; System . out . println ( s . length ()); } }
الإخراج:
Hangup (SIGHUP)
Exception in thread 'main' java.lang.NullPointerException
at Geeks.main(Geeks.java:10)توضيح: في هذا المثال، مرجع السلسلة 's' فارغ. عندما يحاول البرنامج استدعاء الأسلوب length() فإنه يطرح NullPointerException لأنه لا يوجد كائن فعلي.
لماذا يتم استخدام null في Java؟
تعمل القيمة الخالية كعنصر نائب وتشير إلى عدم تعيين أي قيمة لمتغير مرجعي. تشمل التطبيقات الشائعة ما يلي:
- هياكل البيانات المرتبطة : يمثل نهاية القائمة أو فرع الشجرة.
- أنماط التصميم : يُستخدم هذا في أنماط مثل Null Object Pattern أو Singleton Pattern.
كيفية تجنب NullPointerException
لتجنب NullPointerException، يجب علينا التأكد من تهيئة جميع الكائنات بشكل صحيح قبل استخدامها. عندما نعلن عن متغير مرجعي، يجب علينا التحقق من أن الكائن ليس خاليًا قبل أن نطلب طريقة أو حقلًا من الكائنات.
1. استخدام سلسلة حرفية في يساوي ()
تتضمن مشكلة الحالة الشائعة جدًا المقارنة بين متغير سلسلة ومتغير حرفي. قد يكون الحرفي عبارة عن سلسلة أو عنصر من عناصر التعداد. بدلاً من استدعاء الطريقة من الكائن الفارغ، فكر في استدعائها من الكائن الحرفي.
مثال:
Java import java.io.* ; class Geeks { public static void main ( String [] args ) { // Initializing String variable with null value String s = null ; // Checking if s.equals null try { // This line of code throws NullPointerException because s is null if ( s . equals ( 'gfg' )) System . out . print ( 'Same' ); else System . out . print ( 'Not Same' ); } catch ( NullPointerException e ) { System . out . print ( 'NullPointerException Caught' ); } } }
الإخراج
NullPointerException Caught
يمكننا تجنب NullPointerException عن طريق استدعاء يساوي على الحرفي بدلاً من الكائن.
Java import java.io.* ; class Geeks { public static void main ( String [] args ) { // Initializing String variable with null value String s = null ; // Checking if s is null using try catch try { if ( 'gfg' . equals ( s )) System . out . print ( 'Same' ); else System . out . print ( 'Not Same' ); } catch ( NullPointerException e ) { System . out . print ( 'Caught NullPointerException' ); } } }
الإخراج
Not Same
ملحوظة : قم دائمًا باستدعاء يساوي على المستوى الحرفي لتجنب استدعاء أسلوب على مرجع فارغ.
2. التحقق من وسيطات الطريقة
قبل تنفيذ نص الطريقة الجديدة، يجب علينا أولاً التحقق من وسيطاتها بحثًا عن قيم فارغة والاستمرار في تنفيذ الطريقة فقط عندما يتم التحقق من الوسائط بشكل صحيح. وإلا فإنه سيتم طرح IllegalArgumentException وإعلام أسلوب الاستدعاء بوجود خطأ ما في الوسائط التي تم تمريرها.
مثال:
Java import java.io.* ; class Geeks { public static void main ( String [] args ) { // String s set an empty string and calling getLength() String s = '' ; try { System . out . println ( getLength ( s )); } catch ( IllegalArgumentException e ) { System . out . println ( 'IllegalArgumentException caught' ); } // String s set to a value and calling getLength() s = 'GeeksforGeeks' ; try { System . out . println ( getLength ( s )); } catch ( IllegalArgumentException e ) { System . out . println ( 'IllegalArgumentException caught' ); } // Setting s as null and calling getLength() s = null ; try { System . out . println ( getLength ( s )); } catch ( IllegalArgumentException e ) { System . out . println ( 'IllegalArgumentException caught' ); } } public static int getLength ( String s ) { if ( s == null ) throw new IllegalArgumentException ( 'The argument cannot be null' ); return s . length (); } }
الإخراج
0 13 IllegalArgumentException caught
3. استخدم المشغل الثلاثي
يمكن استخدام المشغل الثلاثي لتجنب NullPointerException. أولاً يتم تقييم التعبير المنطقي. إذا كان التعبير صحيحًا، فسيتم إرجاع القيمة 1 وإلا يتم إرجاع القيمة 2. يمكننا استخدام العامل الثلاثي للتعامل مع المؤشرات الفارغة.
مثال:
Java import java.io.* ; class Geeks { public static void main ( String [] args ) { String s = null ; String m = ( s == null ) ? '' : s . substring ( 0 5 ); System . out . println ( m ); s = 'Geeksforgeeks' ; m = ( s == null ) ? '' : s . substring ( 0 5 ); System . out . println ( m ); } }
الإخراج
Geeks
توضيح : يساعد عامل التشغيل الثلاثي في التحقق من وجود القيم الخالية وتجنب العمليات على المراجع الخالية.
4. استخدام الفئة الاختيارية (Java 8+)
في Java 8، تم تقديم فئة اختيارية ككائن حاوية قد يحتوي أو لا يحتوي على قيمة غير فارغة. يساعد على تجنب NullPointerException عن طريق الإجبار على التعامل مع الحالة بشكل صريح عند غياب القيمة.
مثال:
Java import java.util.Optional ; public class OptionalExample { public static void main ( String [] args ) { Optional < String > name = Optional . ofNullable ( null ); // Safe way to access System . out . println ( name . orElse ( 'Default Name' )); // prints: Default Name } }
الإخراج
Default Name
توضيح: يلتف اختياري.ofNullable(value) على القيمة التي قد تكون فارغة. يوفر orElse() خيارًا احتياطيًا في حالة عدم وجود القيمة.