what is nullpointerexception java how avoid it
Bu Eğitim, Java'daki NullPointerException hakkında her şeyi açıklayacaktır. Boş İşaretçi İstisnasının Nedenlerini ve bundan Kaçınma Yollarını tartışacağız:
Java'daki NullPointerException bir çalışma zamanı istisnasıdır. Java, bir nesne referansına özel bir boş değer atar. Bir program, boş değere ayarlanmış bir nesne başvurusu kullanmaya çalıştığında, bu istisna atılır.
=> Basit Java Eğitim Serisine Buradan Dikkat Edin.
Ne öğreneceksin:
Java'da NullPointerException
Boş değerli bir nesne başvurusu NullPointerException atarsa, neden boş bir değere ihtiyacımız var?
Boş değer genellikle bir referans değişkenine hiçbir değer atanmadığını belirtmek için kullanılır. İkinci olarak, boş düğümleri belirtmek için bağlantılı listeler ve ağaçlar gibi koleksiyonlar için boş değerlere ihtiyacımız var. Tekil desenler gibi tasarım desenleri boş değerleri kullanır.
Sonuç olarak, Java'daki boş değerin birçok kullanımı vardır. Boş İşaretçi İstisnası, Java'da belirli senaryolarda atılır.
Bazı senaryolar aşağıdaki gibidir:
- Yöntem boş bir nesne kullanılarak çağrıldı.
- Boş nesnenin bir alanına veya veri üyesine erişme veya bunları değiştirme.
- Bir yönteme bağımsız değişken olarak boş nesne iletme.
- Boş dizinin uzunluğunun hesaplanması.
- Boş dizinin dizinine erişiliyor.
- Boş bir nesneyi senkronize etme.
- Boş bir nesne fırlatmak.
Boş İşaretçi İstisnası, RuntimeException sınıfından genişler.
NullPointerException hiyerarşisi aşağıda verilmiştir.
Yukarıdaki hiyerarşide gösterildiği gibi, Null Pointer Exception, Exception Class'ı devralan RuntimeException'dan genişler. İstisna sınıfı, sırayla, Object'in bir alt sınıfı olan Throwable sınıfından türetilir.
Java.lang.NullPointerException Oluşumunun Nedenleri
Şimdi yukarıda listelediğimiz NullPointerException senaryolarının her birini göstereceğiz.
# 1) Yöntem, boş bir nesne kullanılarak çağrılır
Aşağıdaki kod örneğini düşünün. Burada iki yöntem sağlayan MyClass adlı bir sınıfımız var. İlk yöntem 'initT' boş bir nesne döndürür. Ana yöntemde, initT yöntemine yapılan bir çağrı ile MyClass nesnesini oluşturuyoruz.
Ardından, MyClass'ın yazdırma yöntemini çağırıyoruz. Burada, java.lang.NullPointerException, null bir nesne kullanarak yazdırma yöntemini çağırırken atılır.
class MyClass { public static MyClass initT() { //method returns a null object return null; } public void print(String s) { System.out.println(s.toLowerCase()); } } class Main{ public static void main(String() args) { MyClass t = MyClass.initT(); //create a new object (null object) t.print('Hello, World!'); //invoke method using null object } }
Çıktı
# 2) Boş bir nesnenin erişim alanı
class MyClass { int numField = 100; public static MyClass initT() { //method returns a null object return null; } public void print(String s) { System.out.println(s.toLowerCase()); } } class Main{ public static void main(String() args) { MyClass t = MyClass.initT(); //create a new object (null object) int num = t.numField; //access MyClass member using null object } }
Çıktı
world of warcraft için özel sunucu
Bu, NullPointerException'ın başka bir nedenidir. Burada boş bir nesne kullanarak bir sınıf üyesine erişmeye çalışıyoruz. İnitT yönteminin dönüş değerini t nesnesine atarız ve ardından t nesnesini kullanarak numField'a erişiriz. Ancak initT boş bir nesne döndürdüğü için t nesnesi boş bir nesnedir. Bu noktada java.lang.NullPointerException yükseltilir.
# 3) Boş bir nesneyi argüman olarak iletmek
Bu, java.lang.NullPointerException oluşumunun ortak nedenidir. Aşağıdaki Java programını düşünün. Burada, argüman olarak iletilen String nesnesini küçük harfe dönüştüren bir 'print_LowerCase' yöntemimiz var.
public class Main { public static void print_LowerCase(String s) { System.out.println(s.toLowerCase()); } public static void main(String() args) { print_LowerCase(null); //pass null object as argument to the method } }
Çıktı
Ana yöntemde bu yöntemi çağırıyoruz ve argüman olarak bir null geçiriyoruz. String nesnesi boş olamayacağından, java.lang.NullPointerException atılır.
# 4) Boş dizinin uzunluğunu elde etmek
Boş bir dizinin uzunluğunu hesaplamaya çalışmak da java.lang.NullPointerException oluşmasına neden olur.
Aşağıdaki program bunu göstermektedir.
public class Main { public static void main(String() args) { int() dataArray = null; //Array is null; no data System.out.println('Array Length:' + dataArray.length); //print array length } }
Çıktı
Yukarıdaki programda, bir dizi bildiriyoruz ve ona boş atıyoruz, yani veri yok. Bu boş dizide length özelliğini kullandığımızda, NullPointerException atılır.
# 5) Boş dizinin erişim dizini
Uzunluğa benzer şekilde, bir indeks kullanarak bir boş dizideki bir değere erişmeye çalışsak bile, java.lang.NullPointerException nedenidir.
public class Main { public static void main(String() args) { int() dataArray = null; //Array set to null //access value at index 2 System.out.println('Value at index 2:' + dataArray(2)); } }
Çıktı
Yukarıdaki programda, boş bir dizinin 2. indeksindeki değere erişmeye çalışıyoruz.
# 6) Boş nesnede senkronizasyon
Eşzamanlı erişimi kolaylaştırmak için genellikle bir bloğu veya yöntemi senkronize ederiz. Ancak senkronizasyon için kullandığımız nesne referansı boş olmamalıdır. Boş bir nesne ise, java.lang.NullPointerException ile sonuçlanır.
Aşağıdaki Java programı bunu göstermektedir. Gördüğümüz gibi, null olarak başlatılmış bir 'mutex' String nesnemiz var. Daha sonra ana işlevde, nesne referansı olarak muteks içeren senkronize bir blok kullanırız. Muteks boş olduğundan java.lang.NullPointerException yükseltilir.
public class Main { public static String mutex = null; //mutex variable set to null public static void main(String() args) { synchronized(mutex) { //synchronized block for null mutex System.out.println('synchronized block'); } } }
Çıktı
# 7) Null atarak
public class Main { public static void main(String() args) { throw null; //throw null } }
Çıktı:
Yukarıdaki örnek programda, geçerli bir nesne atmak yerine null atılır. Bu, Null Pointer Özel Durumuna neden olur.
Boş İşaretçi İstisnasını Önleme
Artık NullPointerException oluşumunun nedenlerini gördüğümüze göre, programımızda da bundan kaçınmaya çalışmalıyız.
Öncelikle, Null Pointer Exception ile sonuçlanan boş nesnelerin kullanımından kaçınabilmemiz için programlarımızda kullandığımız nesnelerin doğru şekilde başlatıldığından emin olmalıyız. Ayrıca programda kullanılan referans değişkenlerin geçerli değerlere işaret edilmesine ve yanlışlıkla boş değerler almamasına dikkat etmeliyiz.
Bu hususların yanı sıra, java.lang.NullPointerException'dan kaçınmak için duruma göre daha dikkatli davranabiliriz.
Aşağıda birkaç durumu ele alıyoruz.
# 1) Değişmez değerlerle dize karşılaştırması
Dize değişkeni ile değişmez değer (numaralamanın gerçek değeri veya öğesi) arasındaki karşılaştırma, Java programlarında çok yaygın bir işlemdir. Ancak, bir nesne olan String değişkeni null ise, bu boş nesneyi değişmez değerlerle karşılaştırmak NullPointerException oluşturur.
Dolayısıyla çözüm, karşılaştırma yöntemini boş olabilen String nesnesi yerine değişmez değerden çağırmaktır.
Aşağıdaki program, karşılaştırma yöntemlerini değişmez değerlerden nasıl çağırabileceğimizi ve java.lang.NullPointerExceptiondan nasıl kaçınabileceğimizi gösterir.
class Main { public static void main (String() args) { // String set to null String myStr = null; // Checking if myStr is null using try catch. try { if ('Hello'.equals(myStr)) //use equals method with literal System.out.print('Two strings are same'); else System.out.print('Strings are not equal'); } catch(NullPointerException e) { System.out.print('Caught NullPointerException'); } } }
Çıktı
# 2) Bir yöntemin argümanlarını kontrol edin
Boş değerler olmadıklarından emin olmak için yöntemin argümanlarını kontrol edin. Bağımsız değişkenler belirtime göre değilse, kod, bağımsız değişkenlerin beklendiği gibi olmadığını belirtmek için IllegalArgumentException oluşturur.
Bu, aşağıdaki Java programında gösterilmektedir.
import java.io.*; class Main { public static void main (String() args) { // set String to empty value String myStr = ''; try { System.out.println('String value:' + myStr); System.out.println('String Length:' + getLength(myStr)); } catch(IllegalArgumentException e) { System.out.println('Exception: ' + e.getMessage()); } // Set String to a proper value and call getLength myStr = 'Far from home'; try { System.out.println('String value:' + myStr); System.out.println('String Length:' + getLength(myStr)); } catch(IllegalArgumentException e) { System.out.println('Exception: ' + e.getMessage()); } // Set String to null and call getLength() myStr = null; try { System.out.println('String value:' + myStr); System.out.println('String Length:' + getLength(myStr)); } catch(IllegalArgumentException e) { System.out.println('Exception: ' + e.getMessage()); } } // Method that returns length of the String public static int getLength(String myStr) { if (myStr == null) //throw Exception if String is null throw new IllegalArgumentException('The String argument cannot be null'); return myStr.length(); } }
Çıktı
# 3) Boş değerlerle ilgilenmek için Üçlü Operatörün kullanılması
Java.lang.NullPointerException'ı önlemek için üçlü operatörü kullanabiliriz. Üçlü operatörün üç operatörü vardır. İlki, doğru veya yanlış olarak değerlendirilen bir boole ifadesidir. İfade doğruysa, ikinci operatör döndürülür veya üçüncü operatör döndürülür.
Aşağıdaki program, NullPointerException'ı önlemek için üçlü bir operatörün kullanımını gösterir.
import java.io.*; class Main { public static void main (String() args) { // Initialize String with null value String myStr = null; //return a substring for this String using ternary oprator String myVal = (myStr == null) ? '' : myStr.substring(0,5); if(myVal.equals('')) System.out.println('Empty String!!'); else System.out.println('String value: ' + myVal); // Now set a value for String myStr = 'SoftwareTestingHelp'; //return a substring for this String using ternary oprator myVal = (myStr == null) ? '' : myStr.substring(0,8); if(myVal.equals('')) System.out.println('Empty String!!'); else System.out.println('String value: ' + myVal); }
Çıktı
Sıkça Sorulan Sorular
S # 1) Java'da NullPointerException'ı nasıl düzeltebilirim?
Cevap: Programda kullanılan tüm nesnelerin doğru şekilde başlatıldığından ve boş değerlere sahip olmadığından emin olmalıyız. Ayrıca, referans değişkenleri boş değerlere sahip olmamalıdır.
# 2) NullPointerException işaretli mi yoksa işaretli mi?
Cevap: NullPointerException denetlenen bir istisna değildir. Bu, RuntimeException'ın soyundan gelir ve denetlenmez.
# 3) NullPointerException'ı nasıl durdururum?
Cevap: NullPointerException'dan kaçınmak için en iyi uygulamalardan bazıları şunlardır:
- Boş olabilen bilinmeyen nesnede kullanmak yerine, String değişmez değeriyle equals () ve equalsIgnoreCase () yöntemini kullanın.
- ToString () yerine valueOf () kullanın; ve ikisi de aynı sonucu döndürür.
- Java açıklamasını @NotNull ve @Nullable kullanın.
# 4) Java'daki boş değer nedir?
Cevap: Boş değer, herhangi bir nesneye veya değişkene işaret etmez. Bu bir anahtar kelime ve birebirdir. Boş bir referansı temsil eder.
# 5) Java'da NullPointerException'ı yakalayabilir miyiz?
Cevap: Java.lang.NullPointerException istisnası, denetlenmemiş bir istisnadır ve RuntimeException sınıfını genişletir. Bu nedenle, programcının onu yakalama zorunluluğu yoktur.
Sonuç
Bu öğreticide, Java'da NullPointerException'ı tartıştık. Bu oldukça tehlikeli bir istisnadır ve genellikle hiç beklemediğimizde ortaya çıkabilir. Boş İşaretçi İstisnası çoğunlukla boş nesne veya boş referans nedeniyle oluşur. NullPointerException'dan kaçınmanın nedenlerini ve yollarını zaten gördük.
Mümkün olduğunca, programcı bir programda Boş İşaretçi İstisnasının oluşmasını önlemeye çalışmalıdır. Bu kontrol edilmeyen bir çalışma zamanı istisnası olduğundan, uygulama çalışırken bunun meydana gelmediğini görmeliyiz.
=> Java'yı Sıfırdan Öğrenmek İçin Burayı Ziyaret Edin.
Önerilen Kaynaklar
- Java İstisnaları ve Örneklerle İstisna İşlemleri
- Java'da ArrayIndexOutOfBoundsException Nasıl İşlenir?
- Kod Örnekleriyle C # İstisna İşleme Eğitimi
- Örneklerle PL SQL İstisna İşlemi İçin Eksiksiz Kılavuz
- SoapUI Harika Komut Dosyalarında İstisna Nasıl İşlenir - SoapUI Eğitimi # 11
- Python Hariç Deneyin - Örneklerle Python İstisnasını İşleme
- JDBC Özel Durum İşleme - SQL İstisnalarını İşleme
- C ++ 'da Özel Durum İşleme