- Mesajlar
- 2,410
- En iyi cevaplar
- 98
- Beğeniler
- 2,463
- Puanları
- 10,250
- Ruh hali
Merhabalar!
Bir konuma daha hoş geldiniz. Bu sefer konumuz "null pointer exception", bu hata bir runtime (çalışma zamanı) hatasıdır, bu konuda hem bu hatayı anlatıp, hem de nasıl çözeceğinizden bahsedeceğim. Öncelikle koda erişiminiz yok ise çözmek için yapımcılara raporlamaktan başka şansınız yok diyebilirim. Hemen başlayalım isterseniz!
NullPointerException
İşte o en çok karşılaşılan hata.. Kendisine kısaltma olarak NPE'de denir. Bu hata bir null pointer (null referansı) üzerinde bir işlem yapmaya kalktığınızda ortaya çıkar. Null, hiçbir şeyi (aynı zamanda her şeyi, her çeşit değişkene uyum sağlar.) temsil eder. Yani hiçbir şeydir, yoktur. Şanslıyız ki bu hata çıktığında bize bir stack trace (hata yolu) verilir. Hatanın nerede, kaçıncı satırda çıktığını öğrenebiliriz. Fakat maalesef bazı dillerde olduğu gibi hangi karakterde çıktığını söylemiyor, sadece satırı veriyor. Ki bu çoğu zaman zaten bize yeterli olan kısım. Şimdi sırf test için aşağıya yazdığım kodu yürütüp çıkan hatayı inceleyeceğiz.
Kod:
Bir konuma daha hoş geldiniz. Bu sefer konumuz "null pointer exception", bu hata bir runtime (çalışma zamanı) hatasıdır, bu konuda hem bu hatayı anlatıp, hem de nasıl çözeceğinizden bahsedeceğim. Öncelikle koda erişiminiz yok ise çözmek için yapımcılara raporlamaktan başka şansınız yok diyebilirim. Hemen başlayalım isterseniz!
NullPointerException
İşte o en çok karşılaşılan hata.. Kendisine kısaltma olarak NPE'de denir. Bu hata bir null pointer (null referansı) üzerinde bir işlem yapmaya kalktığınızda ortaya çıkar. Null, hiçbir şeyi (aynı zamanda her şeyi, her çeşit değişkene uyum sağlar.) temsil eder. Yani hiçbir şeydir, yoktur. Şanslıyız ki bu hata çıktığında bize bir stack trace (hata yolu) verilir. Hatanın nerede, kaçıncı satırda çıktığını öğrenebiliriz. Fakat maalesef bazı dillerde olduğu gibi hangi karakterde çıktığını söylemiyor, sadece satırı veriyor. Ki bu çoğu zaman zaten bize yeterli olan kısım. Şimdi sırf test için aşağıya yazdığım kodu yürütüp çıkan hatayı inceleyeceğiz.
Kod:
Java:
package com.lifemcserver.test;
public final class NpeTest
{
public static void main(final String[] args)
{
final String hello = null;
System.out.println(hello.equalsIgnoreCase("hello world")); // eğer hello variablesi "hello world" ise true bastırır, değil ise false (fakat null ise hata verir)
}
}
Bu kodda null olan bir string (yazı) üzerinde String#equalsIgnoreCase methodunu yürütmeye çalışıyoruz. Bu method bildiğiniz (veya bilmediğiniz) üzere bir stringin diğer string ile aynı değeri (yazıyı) içerip içermediğini büyük küçük harfleri yok sayarak kontrol etmemize yarıyor. Bu durumda yukarıdaki kodu çalıştırmaya çalışır isek kod hello variablesi (değişkeni) null olduğu için ve null bir referans üzerinden String#equalsIgnoreCase methodunu yürütemeyeceğimiz için, kod beklenildiği şekilde null pointer exception hatası verecektir. İşte bu yüzden this asla null olamaz (diğer, ilk konumda dediğim bir sözdü). Bir objenin methodu, ortada bir obje olmadan çağrılamaz.
Aynı şekilde sadece methodlar değil, bir objenin içerisindeki static olmayan hiçbir şeye ortada obje olmadan erişemeyiz. Eğer bir null üzerinden erişmeye çalışır isekde bu sefer de null pointer exception hatasını alırız.
Şimdi bu kodun verdiği hatayı inceleyip çözmeye çalışalım:
Aynı şekilde sadece methodlar değil, bir objenin içerisindeki static olmayan hiçbir şeye ortada obje olmadan erişemeyiz. Eğer bir null üzerinden erişmeye çalışır isekde bu sefer de null pointer exception hatasını alırız.
Şimdi bu kodun verdiği hatayı inceleyip çözmeye çalışalım:
Java:
Exception in thread "main" java.lang.NullPointerException
at com.lifemcserver.test.NpeTest.main(NpeTest.java:8)
Hatada ilk kısım hatanın hangi thread'de çıktığını gösteriyor, thread'ı nasıl çevirebilirim bilemiyorum ama şimdilik işlem diyebiliriz. Eğer Thread#setName kullanmadıysanız veya yeni bir thread açıp kodu oradan yürütmedi iseniz bu varsayılan olarak "main" olacaktır. Sonraki kısımda hangi hatanın çıktığını tam ve kendine özgü yolu ile gösteriyor: "java.lang.NullPointerException" yani bizim şu an da konuştuğumuz hata.
Fakat bizim asıl işimize yarayacak önemli kısım "at ..." kısımları. Bu kısımlara stack trace yani hata yolu diyoruz. Burada ilk baştaki "com.lifemcserver.test" kısmı kullandığımız paketin (adresin) adı. Yani NpeTest dosyasında package ...; yazarken com.lifemcserver.test yazdığımız için nasıl NullPointerException'da java.lang.NullPointerException yazıyor ise bizim test kodumuzda da ben com.lifemcserver.test adresini kullandığım için com.lifemcserver.test.NpeTest yazıyor. NpeTest burada hatanın çıktığı Java dosyasını temsil ediyor. Ondan sonra ki .main kısmı ise hangi methodda çıktığını temsil ediyor.
Fakat bunlar bize sadece genel bilgiyi sağlıyor, asıl kısım sondaki parantezler içerisinde gizli. Parantez içerisindeki yazıya bakar isek NpeTest.java:8 yazıyor. Buradaki NpeTest.java, hatanın çıktığı java dosyasını ve 8 ise de satır numarasını temsil ediyor. Peki neden iki adet NpeTest yazıyor, ilk başta da com.lifemcserver.test.NpeTest yazmışlar zaten diyeceksiniz, bunun nedeni tek bir java dosyasına bir den fazla class koyabilmemizdir. Konumuzda dönecek olur isek, :8 kısmı hatanın 8. satırda çıktığını belirtiyor.
Peki bu hatayı nasıl çözeriz?
Hatada bize hatanın NpeTest.java dosyasında yani yukarıda attığım kodda, 8. satırda çıktığı belirtiliyor. Peki 8. satırda ne mi var? hello.equalsIgnoreCase kısmı. Null bir referans olan "hello" adlı variable üzerinde String#equalsIgnoreCase methodunu yürütmeye çalıştığımız için karşımıza bu hata çıkıyor.
Ek:
NullPointerException hatası genelde sadece Java tarafından otomatik olarak atılan (throwlanan) bir hatadır. Yani bunu biz atar veya yakalar isek buna "bad practice" denir. Atmayı anladık, Java atıyor, biz kendimiz atar isek karışıklık çıkabilir. Peki neden yakalamakta "bad practice" olarak geçiyor? Çünkü, NullPointerException Java tarafından null bir referans üzerinde işlem yapmaya kalktığımızda otomatik olarak atılan hatadır. Bu hatayı yakalayıp yok saymak yerine null hatası verdiren referansı bulup çözmek (veya null kontrolü eklemek) daha mantıklıdır.
Bonus:
Yukarıdaki kodda hello null olsa bile hata verdirmeyip false bastırması için ufak bir değişiklik yapabiliriz.
Hata verdiren 8. satırı şu şekilde değiştirelim:
Burada "hello world" bir literal, final, constant veya read-only her ne derseniz artık, bir String'i temsil ediyor. Yani asla null olamaz. Bu durumda "hello world".equalsIgnoreCase(hello) kısmı eğer hello referansı null ise veya "hello world" değil ise false döndürüyor.
Eğer " işaretleri içerisine alarak yazdığınız literal bir string ile karşılaştırma yapmıyor iseniz ve hatayı çözmek istiyor iseniz de if (hello != null) şeklinde basit bir if kısmı ile halledebilirsiniz.
Konumuz bu kadardı,
Sonraki konularda tekrardan görüşmek üzere..
Fakat bizim asıl işimize yarayacak önemli kısım "at ..." kısımları. Bu kısımlara stack trace yani hata yolu diyoruz. Burada ilk baştaki "com.lifemcserver.test" kısmı kullandığımız paketin (adresin) adı. Yani NpeTest dosyasında package ...; yazarken com.lifemcserver.test yazdığımız için nasıl NullPointerException'da java.lang.NullPointerException yazıyor ise bizim test kodumuzda da ben com.lifemcserver.test adresini kullandığım için com.lifemcserver.test.NpeTest yazıyor. NpeTest burada hatanın çıktığı Java dosyasını temsil ediyor. Ondan sonra ki .main kısmı ise hangi methodda çıktığını temsil ediyor.
Fakat bunlar bize sadece genel bilgiyi sağlıyor, asıl kısım sondaki parantezler içerisinde gizli. Parantez içerisindeki yazıya bakar isek NpeTest.java:8 yazıyor. Buradaki NpeTest.java, hatanın çıktığı java dosyasını ve 8 ise de satır numarasını temsil ediyor. Peki neden iki adet NpeTest yazıyor, ilk başta da com.lifemcserver.test.NpeTest yazmışlar zaten diyeceksiniz, bunun nedeni tek bir java dosyasına bir den fazla class koyabilmemizdir. Konumuzda dönecek olur isek, :8 kısmı hatanın 8. satırda çıktığını belirtiyor.
Peki bu hatayı nasıl çözeriz?
Hatada bize hatanın NpeTest.java dosyasında yani yukarıda attığım kodda, 8. satırda çıktığı belirtiliyor. Peki 8. satırda ne mi var? hello.equalsIgnoreCase kısmı. Null bir referans olan "hello" adlı variable üzerinde String#equalsIgnoreCase methodunu yürütmeye çalıştığımız için karşımıza bu hata çıkıyor.
Ek:
NullPointerException hatası genelde sadece Java tarafından otomatik olarak atılan (throwlanan) bir hatadır. Yani bunu biz atar veya yakalar isek buna "bad practice" denir. Atmayı anladık, Java atıyor, biz kendimiz atar isek karışıklık çıkabilir. Peki neden yakalamakta "bad practice" olarak geçiyor? Çünkü, NullPointerException Java tarafından null bir referans üzerinde işlem yapmaya kalktığımızda otomatik olarak atılan hatadır. Bu hatayı yakalayıp yok saymak yerine null hatası verdiren referansı bulup çözmek (veya null kontrolü eklemek) daha mantıklıdır.
Bonus:
Yukarıdaki kodda hello null olsa bile hata verdirmeyip false bastırması için ufak bir değişiklik yapabiliriz.
Hata verdiren 8. satırı şu şekilde değiştirelim:
Java:
System.out.println("hello world".equalsIgnoreCase(hello)); // eğer hello variablesi "hello world" ise true bastırır, değil ise false
Burada "hello world" bir literal, final, constant veya read-only her ne derseniz artık, bir String'i temsil ediyor. Yani asla null olamaz. Bu durumda "hello world".equalsIgnoreCase(hello) kısmı eğer hello referansı null ise veya "hello world" değil ise false döndürüyor.
Eğer " işaretleri içerisine alarak yazdığınız literal bir string ile karşılaştırma yapmıyor iseniz ve hatayı çözmek istiyor iseniz de if (hello != null) şeklinde basit bir if kısmı ile halledebilirsiniz.
Konumuz bu kadardı,
Sonraki konularda tekrardan görüşmek üzere..
Son düzenleme: