logo

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

Bu derste Java'da Boş işaretçi istisnasını öğreneceğiz. Boş işaretçi istisnası bir çalışma zamanı istisnasıdır. Null, bir nesnenin referansına atanabilecek özel bir değer türüdür. Null değerine sahip bir referans kullanılmaya çalışıldığında NullPointerException tetiklenir.

Boş İşaretçi İstisnası İçin Farklı Senaryolar

NullPointerException'ın ortaya çıkabileceği aşağıdaki senaryolardan bazılarını inceleyin.

  • Null'un boyutunu veya uzunluğunu sanki bir öğe dizisiymiş gibi hesaplamak.

Dosya adı: ThrowNullExcep.java

 public class ThrowNullExcep { // main method public static void main(String args[]) { int arr[] = null; // array is assigned a null value System.out.println('The length of the array arr is: ' + arr.length); } } 

Çıktı:

'Main' iş parçacığında Java.lang.NullPointerException istisna: ThrowNullExcep.main(ThrowNullExcep.java:7) konumunda '' null olduğundan dizi uzunluğu okunamıyor
  • Null değerine sahip nesneyi kullanarak bir yöntemi çağırmak.

Dosya adı: ThrowNullExcep1.java

selenyum öğretici
 public class ThrowNullExcep1 { public void foo() { System.out.println('In the method foo.'); } public static void main(String args[]) { ThrowNullExcep1 obj = null; // assigning null value // invoking the method foo() obj.foo(); } } 

Çıktı:

 Exception in thread 'main' java.lang.NullPointerException: Cannot invoke 'ThrowNullExcep1.foo()' because '' is null at ThrowNullExcep1.main(ThrowNullExcep1.java:13) 
  • NULL nesnesi üzerinden senkronizasyon yapmaya çalıştığınızda.

Dosya adı: ThrowNullExcep2.java

 // A Java program that synchronizes over a NULL object. import java.util.*; import java.io.*; // A Class that is required for sending the message class Sendr { public void sendMethod(String mssg) { System.out.println('Sending message: ' + mssg ); try { Thread.sleep(100); } catch (Exception exp) { System.out.println('Thread interrupted.' + exp); } System.out.println('
' + mssg + ' is sent'); } } // A Class that is used to send messages with the help of threads Threads class ThreadSend extends Thread { private String mssg; Sendr sendr; // Received a messge obj and the string // mssge that has to be sent ThreadSend(String mStr, Sendr obj) { mssg = mStr; sendr = obj; } public void run() { // Only a single thread is allowed to send a message // at a time. synchronized(sendr) { // synchronizing the send object sendr.sendMethod(mssg); } } } // Driver class public class ThrowNullExcep2 { // main method public static void main(String args[]) { Sendr sendObj = null; ThreadSend Sth1 = new ThreadSend( ' Hello ' , sendObj ); ThreadSend Sth2 = new ThreadSend( ' Bye Bye ' , sendObj ); // Starting the two threads of the ThreadedSend type Sth1.start(); Sth2.start(); // waiting for the threads to end try { Sth1.join(); Sth2.join(); } catch(Exception exp) { System.out.println('Interrupted : ' + exp); } } } 

Çıktı:

 Exception in thread 'Thread-0' Exception in thread 'Thread-1' java.lang.NullPointerException: Cannot enter synchronized block because 'this.sendr' is null at ThreadSend.run(ThrowNullExcep2.java:42) java.lang.NullPointerException: Cannot enter synchronized block because 'this.sendr' is null at ThreadSend.run(ThrowNullExcep2.java:42) 
  • Bir değer atmak yerine Null atılır.

Dosya adı: ThrowNullExcep3.java

java tarayıcı
 // Modifying or accessing the fields of the Null object. public class ThrowExcep3 { int a; // main method public static void main(String args[]) { // assigning a null value ThrowExcep3 obj = null; obj.a = 3; } } 

Çıktı:

 Exception in thread 'main' java.lang.NullPointerException: Cannot assign field 'a' because '' is null at ThrowExcep3.main(ThrowExcep3.java:10) 

NULL Değer Gereksinimi

Null, Java'da kullanılan özel bir değerdir. Genellikle referans değişkenine atanan bir değerin olmadığını göstermek için kullanılır. Boş değer esas olarak bağlantılı liste veya ağaç gibi veri yapılarının uygulanmasında kullanılır. Singleton modelinde de kullanılır.

NullPointerException'dan Kaçınmak

NullPointerException'dan kaçınmak için, tüm nesnelerin kullanılmadan önce başlatılmasının düzgün bir şekilde yapıldığından emin olunmalıdır. Bir referans değişkeni bildirildiğinde, referans değeri alana veya yönteme erişmek için kullanılmadan önce boş değerin referansa atanmadığını doğrulamak gerekir.

Çözümle ilgili aşağıdaki genel sorunları gözlemleyin.

Dava 1: Dizelerin değişmez değerlerle karşılaştırılması

Yaygın sorunlardan biri, bir değişmez değerin bir String değişkeniyle karşılaştırılmasını içerir. Değişmez değer bir Enum'dan veya bir String'den bir öğe olabilir. Yöntemi boş nesneden çağırmak yerine, değişmez değeri kullanarak onu çağırmayı düşünün.

python baytları dizeye dönüştürür

Dosya adı: NullPntrExcption.java

 import java.io.*; public class NullPntrExcption { // main method public static void main (String[] args) { // Initializing a String variable with a null value String pntr = null; // Checking if pntr.equals null or works fine. try { // The following line of code will raise the NullPointerException // It is because the pntr is null if (pntr.equals('JTP')) { System.out.print('String are the same.'); } else { System.out.print('Strinng are not the same.'); } } catch(NullPointerException e) { System.out.print('NullPointerException has been caught.'); } } } 

Çıktı:

 NullPointerException has been caught. 

Şimdi bundan nasıl kaçınılabileceğini görelim.

Dosya adı: NullPntrExcption1.java

Linux $ev
 public class NullPntrExcption1 { // main method public static void main (String[] args) { // Initializing a String variable with a null value String pntr = null; // Checking if pntr.equals null or works fine. try { // Now, the following line of code will not raise the NullPointerException // It is because the string literal is invoking the equals() method if ('JTP'.equals(pntr)) { System.out.print('String are the same.'); } else { System.out.print('Strinng are not the same.'); } } catch(NullPointerException e) { System.out.print('NullPointerException has been caught.'); } } } 

Çıktı:

 NullPointerException has been caught. 

Durum 2: Yöntem argümanlarına göz kulak olmak

Önce boş değerler için yöntem argümanları kontrol edilmeli ve ardından yöntemin yürütülmesine geçilmelidir. Aksi takdirde, bir IllegalArgumentException oluşturma ve aynı zamanda çağıran yönteme iletilen argümanların yanlış olduğu sinyalini verme olasılığı oldukça yüksektir.

Linux yapımı

Dosya adı: NullPntrExcption2.java

 // A program for demonstrating that one must // check the parameters are null or not before // using them. import java.io.*; public class NullPntrExcption2 { public static void main (String[] args) { // String st is an empty string and invoking method getLength() String st = ''; try { System.out.println(getLength(st)); } catch(IllegalArgumentException exp) { System.out.println('IllegalArgumentException has been caught.'); } // String s set to a value and invoking method getLength() st = 'JTP'; try { System.out.println(getLength(st)); } catch(IllegalArgumentException exp) { System.out.println('IllegalArgumentException has been caught.'); } // Setting st with a value null and invoking method getLength() st = null; try { System.out.println(getLength(st)); } catch(IllegalArgumentException exp) { System.out.println('IllegalArgumentException has been caught. ' + exp); } } // method taht computes the length of a string st. // It throws and IllegalArgumentException, if st is null public static int getLength(String st) { if (st == null) { throw new IllegalArgumentException('The argument can never be null.'); } return st.length(); } } 

Çıktı:

 0 3 IllegalArgumentException has been caught. java.lang.IllegalArgumentException: The argument can never be null. 

Durum 3: Üçlü Operatörün Kullanımı

NullPointerException'dan kaçınmak için üçlü operatör de kullanılabilir. Üçlü olarak Boole ifadesi ilk olarak değerlendirilir. İfade doğru olarak değerlendirilirse val1 döndürülür. Aksi halde val2 döndürülür.

Dosya adı: NullPntrExcption3.java

 // A program for demonstrating the fact that // NullPointerException can be avoided using the ternary operator. import java.io.*; public class NullPntrExcption3 { // main method public static void main (String[] args) { // Initializing String variable with null value String st = null; String mssge = (st == null) ? 'String is Null.' : st.substring(0, 5); System.out.println(mssge); // Initializing the String variable with string literal st = 'javaTpoint'; mssge = (st == null) ? '' : st.substring(0, 10); System.out.println(mssge); } } 

Çıktı:

 String is Null. javaTpoint