استثناء المؤشر الفارغ في جافا

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() خيارًا احتياطيًا في حالة عدم وجود القيمة.