İngilizce dilinde oku

Aracılığıyla paylaş


NullReferenceException Sınıf

Tanım

Null nesne başvurusunun başvurulma girişimi olduğunda oluşan özel durum.

C#
public class NullReferenceException : Exception
C#
public class NullReferenceException : SystemException
C#
[System.Serializable]
public class NullReferenceException : SystemException
C#
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public class NullReferenceException : SystemException
Devralma
NullReferenceException
Devralma
NullReferenceException
Öznitelikler

Açıklamalar

NullReferenceException değeri nullolan bir türdeki üyeye erişmeye çalıştığınızda bir özel durum oluşur. Özel NullReferenceException durum genellikle geliştirici hatasını yansıtır ve aşağıdaki senaryolarda oluşturulur:

  • Bir başvuru türünün örneğini oluşturmayı unutmuşsunuz. Aşağıdaki örnekte bildirilir names ancak hiçbir zaman örnek oluşturmaz:

    C#
    using System;
    using System.Collections.Generic;
    
    public class Example
    {
       public static void Main(string[] args)
       {
          int value = Int32.Parse(args[0]);
          List<String> names;
          if (value > 0)
             names = new List<String>();
    
          names.Add("Major Major Major");
       }
    }
    // Compilation displays a warning like the following:
    //    Example1.cs(10) : warning BC42104: Variable //names// is used before it
    //    has been assigned a value. A null reference exception could result
    //    at runtime.
    //
    //          names.Add("Major Major Major")
    //          ~~~~~
    // The example displays output like the following output:
    //    Unhandled Exception: System.NullReferenceException: Object reference
    //    not set to an instance of an object.
    //       at Example.Main()
    

    Bazı derleyiciler bu kodu derlerken bir uyarı yayınlar. Diğerleri hata verdi ve derleme başarısız oldu. Bu sorunu gidermek için, değerinin artık nullolmaması için nesnesinin örneğini açın. Aşağıdaki örnek bunu bir türün sınıf oluşturucusunu çağırarak yapar.

    C#
    using System;
    using System.Collections.Generic;
    
    public class Example
    {
       public static void Main()
       {
          List<String> names = new List<String>();
          names.Add("Major Major Major");
       }
    }
    
  • Bir diziyi başlatmadan önce boyutlandırmayı unutmuşsunuzdur. Aşağıdaki örnekte, values bir tamsayı dizisi olarak bildirilir, ancak içerdiği öğelerin sayısı hiçbir zaman belirtilmez. Bu nedenle, değerlerini başlatma girişimi bir NullReferenceException özel durum oluşturdu.

    C#
    using System;
    
    public class Example
    {
       public static void Main()
       {
           int[] values = null;
           for (int ctr = 0; ctr <= 9; ctr++)
              values[ctr] = ctr * 2;
    
           foreach (var value in values)
              Console.WriteLine(value);
       }
    }
    // The example displays the following output:
    //    Unhandled Exception:
    //       System.NullReferenceException: Object reference not set to an instance of an object.
    //       at Example.Main()
    

    Aşağıdaki örnekte olduğu gibi, diziyi başlatmadan önce dizideki öğelerin sayısını bildirerek özel durumu ortadan kaldırabilirsiniz.

    C#
    using System;
    
    public class Example
    {
       public static void Main()
       {
           int[] values = new int[10];
           for (int ctr = 0; ctr <= 9; ctr++)
              values[ctr] = ctr * 2;
    
           foreach (var value in values)
              Console.WriteLine(value);
       }
    }
    // The example displays the following output:
    //    0
    //    2
    //    4
    //    6
    //    8
    //    10
    //    12
    //    14
    //    16
    //    18
    

    Dizileri bildirme ve başlatma hakkında daha fazla bilgi için bkz. Diziler ve Diziler.

  • Bir yöntemden null dönüş değeri alırsınız ve sonra döndürülen türdeki bir yöntemi çağırırsınız. Bu bazen bir belge hatasının sonucudur; belgelerinde bir yöntem çağrısının döndürebileceğine nulldikkat edilemez. Diğer durumlarda, kodunuz hatalı bir şekilde yöntemin her zaman null olmayan bir değer döndüreceğini varsayar.

    Aşağıdaki örnekteki kod, yönteminin Array.Find her zaman alanı bir arama dizesiyle FirstName eşleşen bir nesnesi döndürdüğünü Person varsayar. Eşleşme olmadığından çalışma zamanı bir NullReferenceException özel durum oluşturur.

    C#
    using System;
    
    public class Example
    {
       public static void Main()
       {
          Person[] persons = Person.AddRange( new String[] { "Abigail", "Abra",
                                              "Abraham", "Adrian", "Ariella",
                                              "Arnold", "Aston", "Astor" } );
          String nameToFind = "Robert";
          Person found = Array.Find(persons, p => p.FirstName == nameToFind);
          Console.WriteLine(found.FirstName);
       }
    }
    
    public class Person
    {
       public static Person[] AddRange(String[] firstNames)
       {
          Person[] p = new Person[firstNames.Length];
          for (int ctr = 0; ctr < firstNames.Length; ctr++)
             p[ctr] = new Person(firstNames[ctr]);
    
          return p;
       }
    
       public Person(String firstName)
       {
          this.FirstName = firstName;
       }
    
       public String FirstName;
    }
    // The example displays the following output:
    //       Unhandled Exception: System.NullReferenceException:
    //       Object reference not set to an instance of an object.
    //          at Example.Main()
    

    Bu sorunu çözmek için aşağıdaki örnekte olduğu gibi, herhangi bir üyesini çağırmadan önce olmadığından null emin olmak için yöntemin dönüş değerini test edin.

    C#
    using System;
    
    public class Example
    {
       public static void Main()
       {
          Person[] persons = Person.AddRange( new String[] { "Abigail", "Abra",
                                              "Abraham", "Adrian", "Ariella",
                                              "Arnold", "Aston", "Astor" } );
          String nameToFind = "Robert";
          Person found = Array.Find(persons, p => p.FirstName == nameToFind);
          if (found != null)
             Console.WriteLine(found.FirstName);
          else
             Console.WriteLine("{0} not found.", nameToFind);
       }
    }
    
    public class Person
    {
       public static Person[] AddRange(String[] firstNames)
       {
          Person[] p = new Person[firstNames.Length];
          for (int ctr = 0; ctr < firstNames.Length; ctr++)
             p[ctr] = new Person(firstNames[ctr]);
    
          return p;
       }
    
       public Person(String firstName)
       {
          this.FirstName = firstName;
       }
    
       public String FirstName;
    }
    // The example displays the following output:
    //        Robert not found
    
  • Bir değeri almak için bir ifade kullanıyorsunuz (örneğin, yöntem veya özellik listesini birbirine zincirliyorsunuz) ve değerin nullolup olmadığını denetleseniz de çalışma zamanı yine de bir NullReferenceException özel durum oluşturur. Bu durum, ifadedeki ara değerlerden birinin döndürdüğü nulliçin oluşur. Sonuç olarak, için null testiniz hiçbir zaman değerlendirilmez.

    Aşağıdaki örnek, nesneler tarafından Page sunulan web sayfaları hakkındaki bilgileri önbelleğe alan bir Pages nesneyi tanımlar. yöntemi, Example.Main geçerli web sayfasının null olmayan bir başlığı olup olmadığını denetler ve varsa başlığı görüntüler. Ancak bu denetime rağmen yöntemi bir NullReferenceException özel durum oluşturur.

    C#
    using System;
    
    public class Example
    {
       public static void Main()
       {
          var pages = new Pages();
          if (! String.IsNullOrEmpty(pages.CurrentPage.Title)) {
             String title = pages.CurrentPage.Title;
             Console.WriteLine("Current title: '{0}'", title);
          }
       }
    }
    
    public class Pages
    {
       Page[] page = new Page[10];
       int ctr = 0;
    
       public Page CurrentPage
       {
          get { return page[ctr]; }
          set {
             // Move all the page objects down to accommodate the new one.
             if (ctr > page.GetUpperBound(0)) {
                for (int ndx = 1; ndx <= page.GetUpperBound(0); ndx++)
                   page[ndx - 1] = page[ndx];
             }
             page[ctr] = value;
             if (ctr < page.GetUpperBound(0))
                ctr++;
          }
       }
    
       public Page PreviousPage
       {
          get {
             if (ctr == 0) {
                if (page[0] == null)
                   return null;
                else
                   return page[0];
             }
             else {
                ctr--;
                return page[ctr + 1];
             }
          }
       }
    }
    
    public class Page
    {
       public Uri URL;
       public String Title;
    }
    // The example displays the following output:
    //    Unhandled Exception:
    //       System.NullReferenceException: Object reference not set to an instance of an object.
    //       at Example.Main()
    

    Önbellekte hiçbir sayfa bilgisi depolanmadıysa döndürdüğünden pages.CurrentPagenull özel durum oluşturulur. Bu özel durum, aşağıdaki örnekte olduğu gibi geçerli Page nesnenin CurrentPageTitle özelliğini almadan önce özelliğin değeri test edilerek düzeltilebilir:

    C#
    using System;
    
    public class Example
    {
       public static void Main()
       {
          var pages = new Pages();
          Page current = pages.CurrentPage;
          if (current != null) {
             String title = current.Title;
             Console.WriteLine("Current title: '{0}'", title);
          }
          else {
             Console.WriteLine("There is no page information in the cache.");
          }
       }
    }
    // The example displays the following output:
    //       There is no page information in the cache.
    
  • Başvuru türlerini içeren bir dizinin öğelerini numaralandırırsınız ve öğelerden birini işleme girişiminiz bir NullReferenceException özel durum oluşturur.

    Aşağıdaki örnek bir dize dizisini tanımlar. Deyimi for dizideki öğeleri numaralandırır ve dizeyi görüntülemeden önce her dizenin Trim yöntemini çağırır.

    C#
    using System;
    
    public class Example
    {
       public static void Main()
       {
          String[] values = { "one", null, "two" };
          for (int ctr = 0; ctr <= values.GetUpperBound(0); ctr++)
             Console.Write("{0}{1}", values[ctr].Trim(),
                           ctr == values.GetUpperBound(0) ? "" : ", ");
          Console.WriteLine();
       }
    }
    // The example displays the following output:
    //    Unhandled Exception:
    //       System.NullReferenceException: Object reference not set to an instance of an object.
    //       at Example.Main()
    

    Dizinin her öğesinin null olmayan bir değer içermesi gerektiğini ve dizi öğesinin değerinin aslında nullolduğunu varsayarsanız bu özel durum oluşur. Aşağıdaki örnekte gösterildiği gibi, öğenin bu öğe null üzerinde herhangi bir işlem yapmadan önce olup olmadığını test ederek özel durum ortadan kaldırılabilir.

    C#
    using System;
    
    public class Example
    {
       public static void Main()
       {
          String[] values = { "one", null, "two" };
          for (int ctr = 0; ctr <= values.GetUpperBound(0); ctr++)
             Console.Write("{0}{1}",
                           values[ctr] != null ? values[ctr].Trim() : "",
                           ctr == values.GetUpperBound(0) ? "" : ", ");
          Console.WriteLine();
       }
    }
    // The example displays the following output:
    //       one, , two
    
  • Bağımsız NullReferenceException değişkenlerinden birinin üyesine eriştiğinde yöntemi tarafından özel durum oluşturulabilir, ancak bu bağımsız değişken olur null. PopulateNames Aşağıdaki örnekteki yöntemi, satırına names.Add(arrName);özel durumu oluşturur.

    C#
    using System;
    using System.Collections.Generic;
    
    public class Example
    {
       public static void Main()
       {
          List<String> names = GetData();
          PopulateNames(names);
       }
    
       private static void PopulateNames(List<String> names)
       {
          String[] arrNames = { "Dakota", "Samuel", "Nikita",
                                "Koani", "Saya", "Yiska", "Yumaevsky" };
          foreach (var arrName in arrNames)
             names.Add(arrName);
       }
    
       private static List<String> GetData()
       {
          return null;
       }
    }
    // The example displays output like the following:
    //    Unhandled Exception: System.NullReferenceException: Object reference
    //    not set to an instance of an object.
    //       at Example.PopulateNames(List`1 names)
    //       at Example.Main()
    

    Bu sorunu gidermek için yöntemine geçirilen bağımsız değişkenin olmadığından nullemin olun veya bir try…catch…finally blokta oluşan özel durumu işleyin. Daha fazla bilgi için bkz. Özel durumlar.

Aşağıdaki Microsoft ara dili (MSIL) yönergeleri şu şekildedirNullReferenceException: callvirt, cpblk, cpobj, initblk, ldelem.<type>, ldelema, , ldfldaldfld, ldlenldind.<type>, stelem.<type>, stfld, , stind.<type>ve throwunbox.

NullReferenceException değeri 0x80004003 olan HRESULT COR_E_NULLREFERENCE kullanır.

örneğinin ilk özellik değerlerinin NullReferenceExceptionlistesi için oluşturuculara NullReferenceException bakın.

Yayın kodunda NullReferenceException İşleme

NullReferenceException'dan kaçınmak, oluştuktan sonra işlemekten daha iyidir. Bir özel durumun işlenmesi kodunuzun korunmasını ve anlaşılmasını zorlaştırabilir ve bazen başka hatalar da oluşturabilir. NullReferenceException genellikle kurtarılamaz bir hatadır. Böyle durumlarda, özel durumun uygulamayı durdurmasına izin vermek en iyi alternatif olabilir.

Ancak, hatayı işlemenin yararlı olabileceği birçok durum vardır:

  • Uygulamanız null olan nesneleri yoksayabilir. Örneğin, uygulamanız veritabanındaki kayıtları alır ve işlerse, null nesnelere neden olan bazı hatalı kayıtları yoksayabilirsiniz. Bozuk verileri günlük dosyasına veya uygulama kullanıcı arabirimine kaydetmek tek yapmanız gereken olabilir.

  • Özel durumdan kurtarabilirsiniz. Örneğin, başvuru türü döndüren bir web hizmetine yapılan çağrı, bağlantı kaybolursa veya bağlantı zaman aşımına uğrırsa null döndürebilir. Bağlantıyı yeniden kurmaya çalışabilir ve aramayı yeniden deneyebilirsiniz.

  • Uygulamanızın durumunu geçerli bir duruma geri yükleyebilirsiniz. Örneğin, NullReferenceException oluşturan bir yöntemi çağırmadan önce bilgileri bir veri deposuna kaydetmenizi gerektiren çok adımlı bir görev gerçekleştiriyor olabilirsiniz. Başlatılmamış nesne veri kaydını bozarsa, uygulamayı kapatmadan önce önceki verileri kaldırabilirsiniz.

  • Özel durumu bildirmek istiyorsunuz. Örneğin, hataya uygulamanızın kullanıcısından gelen bir hata neden olmuşsa, doğru bilgileri sağlamalarına yardımcı olmak için bir ileti oluşturabilirsiniz. Sorunu çözmenize yardımcı olması için hata hakkındaki bilgileri de günlüğe kaydedebilirsiniz. ASP.NET gibi bazı çerçevelerde, uygulamanın hiçbir zaman kilitlenmediğini belirten tüm hataları yakalayan üst düzey bir özel durum işleyicisi vardır; Bu durumda, özel durumun günlüğe kaydedilmesi, bunun gerçekleştiğini bilmenin tek yolu olabilir.

Oluşturucular

NullReferenceException()

Sınıfının yeni bir örneğini NullReferenceException başlatır ve yeni örneğin özelliğini hatayı açıklayan sistem tarafından sağlanan bir iletiye ayarlar Message . Örneğin, "Nesne örneğinin gerekli olduğu yerde 'null' değeri bulundu." Bu ileti geçerli sistem kültürünü hesaba katıyor.

NullReferenceException(SerializationInfo, StreamingContext)
Geçersiz.

NullReferenceException sınıfının yeni bir örneğini serileştirilmiş verilerle başlatır.

NullReferenceException(String)

Belirtilen hata iletisiyle sınıfının yeni bir örneğini NullReferenceException başlatır.

NullReferenceException(String, Exception)

Sınıfın NullReferenceException yeni bir örneğini belirtilen bir hata iletisiyle ve bu özel durumun nedeni olan iç özel duruma başvuruyla başlatır.

Özellikler

Data

Özel durum hakkında kullanıcı tanımlı ek bilgiler sağlayan bir anahtar/değer çifti koleksiyonu alır.

(Devralındığı yer: Exception)
HelpLink

Bu özel durumla ilişkili yardım dosyasının bağlantısını alır veya ayarlar.

(Devralındığı yer: Exception)
HResult

Belirli bir özel duruma atanan kodlanmış sayısal bir değer olan HRESULT'u alır veya ayarlar.

(Devralındığı yer: Exception)
InnerException

Exception Geçerli özel duruma neden olan örneği alır.

(Devralındığı yer: Exception)
Message

Geçerli özel durumu açıklayan bir ileti alır.

(Devralındığı yer: Exception)
Source

Hataya neden olan uygulamanın veya nesnenin adını alır veya ayarlar.

(Devralındığı yer: Exception)
StackTrace

Çağrı yığınındaki anlık çerçevelerin dize gösterimini alır.

(Devralındığı yer: Exception)
TargetSite

Geçerli özel durumu oluşturan yöntemini alır.

(Devralındığı yer: Exception)

Yöntemler

Equals(Object)

Belirtilen nesnenin geçerli nesneye eşit olup olmadığını belirler.

(Devralındığı yer: Object)
GetBaseException()

Türetilmiş bir sınıfta geçersiz kılındığında, sonraki bir veya daha fazla özel durumun kök nedeni olan değerini döndürür Exception .

(Devralındığı yer: Exception)
GetHashCode()

Varsayılan karma işlevi işlevi görür.

(Devralındığı yer: Object)
GetObjectData(SerializationInfo, StreamingContext)
Geçersiz.

Türetilmiş bir sınıfta geçersiz kılındığında, özel durumla ilgili bilgilerle öğesini SerializationInfo ayarlar.

(Devralındığı yer: Exception)
GetType()

Geçerli örneğin çalışma zamanı türünü alır.

(Devralındığı yer: Exception)
MemberwiseClone()

Geçerli Objectöğesinin sığ bir kopyasını oluşturur.

(Devralındığı yer: Object)
ToString()

Geçerli özel durumun dize gösterimini oluşturur ve döndürür.

(Devralındığı yer: Exception)

Ekinlikler

SerializeObjectState
Geçersiz.

Bir özel durum, özel durum hakkında serileştirilmiş veriler içeren bir özel durum nesnesi oluşturmak üzere seri hale getirildiğinde gerçekleşir.

(Devralındığı yer: Exception)

Şunlara uygulanır

Ürün Sürümler
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

Ayrıca bkz.