logo

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:



açık kaynaklı bir işletim sistemi örneği
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.

Java'da dizeler nasıl birleştirilir

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.

birleştirme sıralaması java
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.

strin'i int'ye dönüştür

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.