Object Reference Not Set To An Instance Of An Object Hatası
15.07.2012 18:35:15 | Okunma Sayisi : 183030 | Yorum Sayisi : 10
Yazılım geliştirirken karşınıza en çok çıkan/çıkacak hatalardan biridir, Object reference not set to an instance of an object hatası.
Hatanın sebebi; NULL olan, referans tipinde bir değişkenin bir üyesine erişmeye çalışmanızdır. Yani sizin bir class' ınız var, bu class' ınızın nesnesi NULL iken, bu class içerisindeki bir üyeye erişmeye çalışıyorsunuz.
Basit bir örnek ile bakacak olursak;
Calisan isminde bir class' ımız var.
class Calisan
{
public string Ad { get; set; }
}
ve bir metot içerisinde, Calisan class' ından cls nesnesini tanımladık.
private void button1_Click(object sender, EventArgs e)
{
Calisan cls = null;
this.Text = cls.Ad; //runtime hata verecek olan satır
}
button click içerisinde cls nesnesinin Ad özelliğini Form' un Text özelliğine eşitlemek istedik, cls nesnesi NULL olduğu için this.Text = cls.Ad; satırında runtime hatası alacağız. Hata mesajı olarak da Object reference not set to an instance of an object verecektir, Türkçe olarak da Nesne başvurusu bir nesnenin örneğine ayarlanmadı.
Yukarıdaki basit örnekte cls isimli Calisan nesnesini doğrudan NULL' a eşitledim. Object reference not set to an instance of an object hatası aldığınız, sizin örneğinizde doğrudan NULL' a eşitlenmemiş olacaktır muhtemelen. Bir metottan dönen değere vb. bir eşitleme sonucunda NULL olacaktır.
Başka bir örnek;
Calisan cls = context.Calisans.FirstOrDefault(x => x.Id == 9999);
string ad = cls.Ad;
Veritabanında, Id' si 9999 olan bir Calisan yok ise, FirstOrDefault metodu geriye NULL döndürecektir. Yani cls nesnesi NULL olacaktır ve bir alt satırında cls nesnesinin Ad özelliğinin değerini çekmeye çalıştığımızda Object reference not set to an instance of an object hatası alacaksınız.
Sadece property (özellik)' lerde değil, class içerisindeki herhangi member' a (üyeye) erişmeye çalıştığınızda, üyesine erişmeye çalıştığınız nesne NULL ise Object reference not set to an instance of an object hatasını alırsınız.
Aynı class içerisine Yap isminde bir metot ekledim. Metodun içerisinde neler yapılacağı önemli değil, bu yüzden boş bıraktım.
class Calisan
{
public string Ad { get; set; }
public void Yap()
{
//...
}
}
Form_Load içerisinde Yap metodunu çağırdık ve uygulamayı çalıştırdığımızda Object reference not set to an instance of an object hatasını aldık. Çünkü cls nesnesi NULL ve NULL olan bir nesnenin herhangi bir üyesine erişemeyiz.
private void Form1_Load(object sender, EventArgs e)
{
Calisan cls = null;
cls.Yap();
}
Çözüm olarak;
NULL kontrolü yapmanız gerekir.
Property (özellik) örneğinde;
private void button1_Click(object sender, EventArgs e)
{
Calisan cls = null;
if (cls != null)
{
this.Text = cls.Ad;
}
}
Metot örneğinde ise;
private void Form1_Load(object sender, EventArgs e)
{
Calisan cls = null;
if (cls != null)
{
cls.Yap();
}
}
Yapılan NULL kontrolü tabiki nesnenin NULL kalmasını değiştirmez, sadece runtime' da alacağınız Object reference not set to an instance of an object hatasını engeller. Nesne yine NULL kalmaya devam eder.
10 Yorum