Merhabalar, C# NullReferenceException – Nedenleri ve Kullanımı dersim ile C# eğitim setime ve Exceptions derslerime devam ediyorum. Önceki Exceptions dersimde C# IOException Nedir? IOException İşlemleri konusuna değinmiştik. Bu dersimizde ise çok sık karşılaştığımız bir özel durum olan C# NullReferenceException konusunda değineceğiz.
C# NullReferenceException – Nedenleri ve Kullanımı
Devralma : Object > Exception > SystemException >NullReferenceException
C# NullReferenceException – Nedenleri
NullReferenceException, Null olmaması gereken bir değer ile işlem yapılmaya çalışıldığında alınan bir özel durumdur. Bu özel durum ile sık sık karşılaşırız. Sık sık karşılatığımız gibi belki de yüzlerce farklı şekilde ortaya çıkabilmektedir.
NOT: Bu özel durumların çıkma sebebini anladığımızda çözüm müdahelesi daha kolay olacaktır.
Benim sık sık karşılaştığım çıkma şekli;
Bir gridview’de bir sorgu gösterdiğimde ve grid doldurma kodlarını başka bir formdan kopyalayarak aldığım için stun gizleme işlemi varsa ve bu stun verdiğim sorguda yok ise bu stun gizleme kod satırından NullReferenceException özel durumu alıyorum. Çünkü stun gizleme kodundaki ilgili stun gridview’de yer almıyor oluyor. Yani gridview ‘de stun gizlemek istiyorsunuz ama o stun gridvew’de yer almıyor.
Bu özel durumun ortaya çıkmasına neden olan şey neredeyse tamamen geliştiricinin yaptığı hatalardan dolayıdır. Yani kodlardaki bir hatadan dolayı ortaya çıkan bir özel durumdur.
Aşağıdaki örneği çalıştırdığımızda da ilgili özel durumu alırız.
int[] values = null; for (int ctr = 0; ctr <= 9; ctr++) values[ctr] = ctr * 2; foreach (var value in values) Console.WriteLine(value);
values ArrayList’in null olması ve içinde hiçbir değerin olmadığı bir ArrayList üzerinden bir döngüsel işlem yapmaya çalıştığımız için NullReferenceException özel durumu ortaya çıkar. Bu örnekte karşımıza çıkacak olan özel durum geliştiricinin bu özel durumun oluşacağını bilememesinden dolayıdır. Yani yine geliştirici hatasıdır. Bu örnek aşağıdaki gibi olmak zorundadır.
int[] values = new int[10]; for (int ctr = 0; ctr <= 9; ctr++) values[ctr] = ctr * 2; foreach (var value in values) Console.WriteLine(value);
Örnekte gördüğünüz gibi values ArrayList’inin 10 değer alabileceğini belirttik ve döngüye soktuğumuzda bir özel durum almadık.
Bir NullReferenceException özel durumunu işlemek (Try Catch) yerine özel durumu sebep olan kodları düzeltmek daha önemlidir. Eğer kod işleyişine bir engel teşkil etmiyorsa ya da çalışmasa da olur gibi bir işlem ise NullReferenceException özel durumunu işleyebilirsiniz.
C# NullReferenceException – Kullanımı
NullReferenceException kullanımına gelirsek, null olmasını istemediğiniz bir değerin null girilmesi durumunda ele alabilirsiniz. Kullanım örneklerini önceki Exceptions derslerimde bulabilirsiniz. Temel olarak her türlü kullanım konusu aynıdır. Aşağıda basit bir örnek görebilirsiniz.
#region NullReferenceException Çıkarma ve Yakalama Örneği private void btn_NullReferenceException_Click(object sender, EventArgs e) { string disaridan_alinan_deger = null; try { yapilacak_islem(disaridan_alinan_deger); } catch (NullReferenceException ex) { txt_cikti.Text += ex.GetType().Name + ":" + ex.Message; } } string yapilacak_islem(string s) { if (s == null) { throw new NullReferenceException("XXX Değeri boş bir değer olamaz. Bir değer girmek zorundasınız."); } else { // islemler return s; } } #endregion
Örnekte gördüğünüz gibi boş olmasını istemediğiniz bir değer var ise NullReferenceException özel durum verilmesini isteyebilirsiniz.
Bu özel durumları kullanmanın en büyük avantajı bir dll oluşturmak istediğinizde dll kullanımında ortaya çıkabilecek hataları mantıklı geri dönüşler ile dll i kullanan kişileri doğru yönlendirebilirsiniz.
C# NullReferenceException – Nedenleri ve Kullanımı dersimiz de bu kadardı arkadaşlar.
Tüm Exceptions derslerime bağlantıdan ulaşabilirsiniz.
Daha fazla detay için Microsoft.Docs sitesinde bakabilirsiniz.
C Sharp Eğitim Seti eğitimi sayfasına gitmek için tıklayınız.
Derslerime özel olarak hazırladığım Github Projeme buradan ulaşabilirsiniz… Bu dersim Github projemde yerini almıştır. Tüm Exception adı altında eklediğim dersleri Github projeme ekleyeceğim.
Sağlıcakla ve takipte kalın.
Selamlar hocam bunu Try Catch yapısı ile de sağlamak mümkün. Ben genelde projelerimde bu şekilde ilerliyor ve hata kodunu kendime mail olarak gönderirken kullanıcıya da boş veya null olan bu değeri belirtip geri işlem yapmasını sağlıyorum. Ellerinize sağlık yine de fayda bilgiler paylaşıyor bizlere destek oluyorsunuz. İyi çalışmalar dilerim hocam..
Bu konuda şunu söylemek isterim. C# ‘ın varsayılan olarak C# NullReferenceException tetikleme noktaları var. Bu tetiklemeleri kendi sınıfları içinde belirtiliyor.
Dikakt edersen C# NullReferenceException yazılımcının hatasıdır diyor Microsoft. Geliştirme aşamasına yapılan hatalar yada gözden kaçırılan noktalardan dolayı C# NullReferenceException özel durumu yaşanıyor. Microsoft yine, bunları try catch ile yakalamak yerine sorunun kökünü bulup düzeltin önerisinde bulunuyor.
Burada kullanım amacı ile verilen örnekte sizin geliştirdiğiniz metodlar içindir. Örneğin bir class hazırladınız ve bunu DLL yaptınız. Bu DLL ‘de çıkan sorunları yukarıdaki gibi kullanımlarla DLL’i kullanan kişiye bildirmelisiniz ki kullanan kişi kodlarını düzeltebilsin.
Mesela null değer almaması gereken bir metodunuz var ve kullanıcı bu metodu kullanırken null değer gönderdi bunu C# NullReferenceException sınıfı ile göndermelisiniz ki kullanıcı null değer gittiğini fark etsin.