Java'da Boş İşaretçi İstisnası

Java'daki NullPointerException bir RuntimeException'dır. Bir program boş değere sahip bir nesne referansını kullanmaya çalıştığında ortaya çıkar. Java'da 'null', bir değerin yokluğunu belirtmek için nesne referanslarına atanabilen özel bir değerdir.

Boş İşaretçi İstisnasının Nedenleri

Aşağıdaki nedenlerden dolayı bir NullPointerException oluşur: 

  • Boş bir nesneden bir yöntemi çağırmak.
  • Boş bir nesnenin alanına erişme veya bu alanı değiştirme.
  • null uzunluğunu sanki bir diziymiş gibi almak.
  • Boş nesnelerin yuvalarına sanki bir diziymiş gibi erişme veya bunları değiştirme.
  • Atılabilir bir değermiş gibi null atmak.
  • Boş bir nesne üzerinden senkronizasyon yapmaya çalıştığınızda.

Örnek:

Java
   public     class   Geeks     {          public     static     void     main  (  String  []     args  )     {          // Reference set to null      String     s     =     null  ;             System  .  out  .  println  (  s  .  length  ());         }   }   

Çıkış:

 Hangup (SIGHUP)   
Exception in thread 'main' java.lang.NullPointerException
at Geeks.main(Geeks.java:10)

Açıklama: Bu örnekte dize referansı 's' boştur. Program, uzunluk() yöntemini çağırmayı denediğinde, gerçek bir nesne olmadığından bir NullPointerException oluşturur.

Java'da neden null kullanılıyor?

Boş değer yer tutucu görevi görür ve referans değişkenine hiçbir değer atanmadığını gösterir. Yaygın uygulamalar şunları içerir:

  • Bağlantılı Veri Yapıları : Bir listenin veya ağaç dalının sonunu temsil eder.
  • Tasarım Desenleri : Bu, Boş Nesne Kalıbı veya Tekil Kalıbı gibi kalıplarda kullanılır.

NullPointerException'dan Nasıl Kaçınılır?

NullPointerException'dan kaçınmak için, tüm nesnelerin kullanılmadan önce düzgün şekilde başlatıldığından emin olmalıyız. Bir referans değişkeni bildirdiğimizde nesnelerden bir yöntem veya alan talep etmeden önce nesnenin null olmadığını doğrulamamız gerekir.

1. Equals()'da Dize Değişmezlerini Kullanmak

Çok yaygın bir durum problemi, bir String değişkeni ile bir değişmez değer arasındaki karşılaştırmayı içerir. Değişmez değer bir String veya bir Enum öğesi olabilir. Yöntemi boş nesneden çağırmak yerine onu değişmez değerden çağırmayı düşünün. 

Örnek:

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'  );      }      }   }   

Çıkış
NullPointerException Caught 

Nesne yerine değişmez değeri çağırarak NullPointerException'ı önleyebiliriz.

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'  );      }      }   }   

Çıkış
Not Same 

Not : Boş bir başvuruda bir yöntemin çağrılmasını önlemek için her zaman değişmez değerde equals'i çağırın.

2. Yöntem Argümanlarını Kontrol Etme

Yeni yöntemin gövdesini çalıştırmadan önce, ilk olarak bağımsız değişkenlerini boş değerler açısından kontrol etmeli ve yalnızca bağımsız değişkenler uygun şekilde kontrol edildiğinde yöntemin yürütülmesine devam etmeliyiz. Aksi halde bir IllegalArgumentException oluşturacak ve çağıran yönteme iletilen bağımsız değişkenlerde bir sorun olduğu konusunda bildirimde bulunacaktır. 

Örnek:

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  ();      }   }   

Çıkış
0 13 IllegalArgumentException caught  

3. Üçlü Operatör Kullanın

NullPointerException'ı önlemek için üçlü operatör kullanılabilir. İlk olarak Boolean ifadesi değerlendirilir. İfade doğruysa değer1 döndürülür, aksi takdirde değer2 döndürülür. Boş göstericileri işlemek için üçlü operatörü kullanabiliriz.

Örnek:

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  );      }   }   

Çıkış
Geeks  

Açıklama : Üçlü operatör, boş değerlerin kontrol edilmesine ve boş referanslar üzerindeki işlemlerden kaçınılmasına yardımcı olur.

4. İsteğe Bağlı Sınıfı Kullanma (Java 8+)

Java 8'de Optional sınıfı, boş olmayan bir değer içerebilen veya içermeyebilen bir kap nesnesi olarak tanıtıldı. Kaçınılmasına yardımcı olur NullPointerException bir değer olmadığında durumu açıkça ele almaya zorlayarak.

Örnek:

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      }   }   

Çıkış
Default Name  

Açıklama: Optional.ofNullable(value), null olabilecek değeri sarar. orElse(), değer mevcut değilse bir geri dönüş sağlar.