本文由机器翻译。若要查看英语原文,请勾选“英语”复选框。 也可将鼠标指针移到文本上,在弹出窗口中显示英语原文。
翻译
英语

NullReferenceException 类

 

尝试取消引用空对象引用时引发的异常。

命名空间:   System
程序集:  mscorlib(位于 mscorlib.dll)

System.Object
  System.Exception
    System.SystemException
      System.NullReferenceException

[SerializableAttribute]
[ComVisibleAttribute(true)]
public class NullReferenceException : SystemException

名称说明
System_CAPS_pubmethodNullReferenceException()

初始化的新实例NullReferenceException类,设置Message为系统提供的消息的描述错误,如"值 'null' 找到其中对象的实例了所需。"的新实例的属性 此消息将当前系统区域性考虑在内。

System_CAPS_protmethodNullReferenceException(SerializationInfo, StreamingContext)

用序列化数据初始化 NullReferenceException 类的新实例。

System_CAPS_pubmethodNullReferenceException(String)

用指定的错误消息初始化 NullReferenceException 类的新实例。

System_CAPS_pubmethodNullReferenceException(String, Exception)

使用指定的错误消息和对作为此异常原因的内部异常的引用来初始化 NullReferenceException 类的新实例。

名称说明
System_CAPS_pubpropertyData

获取提供有关异常的其他用户定义信息的键/值对集合。(继承自 Exception。)

System_CAPS_pubpropertyHelpLink

获取或设置指向与此异常关联的帮助文件链接。(继承自 Exception。)

System_CAPS_pubpropertyHResult

获取或设置 HRESULT(一个分配给特定异常的编码数字值)。(继承自 Exception。)

System_CAPS_pubpropertyInnerException

获取导致当前异常的 Exception 实例。(继承自 Exception。)

System_CAPS_pubpropertyMessage

获取描述当前异常的消息。(继承自 Exception。)

System_CAPS_pubpropertySource

获取或设置导致错误的应用程序或对象的名称。(继承自 Exception。)

System_CAPS_pubpropertyStackTrace

获取调用堆栈上的即时框架字符串表示形式。(继承自 Exception。)

System_CAPS_pubpropertyTargetSite

获取引发当前异常的方法。(继承自 Exception。)

名称说明
System_CAPS_pubmethodEquals(Object)

确定指定的对象是否等于当前对象。(继承自 Object。)

System_CAPS_protmethodFinalize()

在垃圾回收将某一对象回收前允许该对象尝试释放资源并执行其他清理操作。(继承自 Object。)

System_CAPS_pubmethodGetBaseException()

当在派生类中重写时,返回 Exception,它是一个或多个并发的异常的根源。(继承自 Exception。)

System_CAPS_pubmethodGetHashCode()

作为默认哈希函数。(继承自 Object。)

System_CAPS_pubmethodGetObjectData(SerializationInfo, StreamingContext)

当在派生类中重写时,用关于异常的信息设置 SerializationInfo(继承自 Exception。)

System_CAPS_pubmethodGetType()

获取当前实例的运行时类型。(继承自 Exception。)

System_CAPS_protmethodMemberwiseClone()

创建当前 Object 的浅表副本。(继承自 Object。)

System_CAPS_pubmethodToString()

创建并返回当前异常的字符串表示形式。(继承自 Exception。)

名称说明
System_CAPS_proteventSerializeObjectState

当异常被序列化用来创建包含有关该异常的徐列出数据的异常状态对象时会出现该问题。(继承自 Exception。)

ANullReferenceException当你尝试访问其值的类型成员时引发异常null ANullReferenceException异常通常反映开发人员错误,并且在以下方案中引发︰

  • 你忘记了实例化一个引用类型。 在下面的示例中,names声明,但决不实例化︰

    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.vb(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()
    

    它们编译此代码时,一些编译器会发出警告。 其他人发出错误,并且编译将失败。 若要解决此问题,实例化对象,以便其值不再null 下面的示例将这是通过调用类型的类构造函数。

    using System;
    using System.Collections.Generic;
    
    public class Example
    {
       public static void Main()
       {
          List<String> names = new List<String>();
          names.Add("Major Major Major");
       }
    }
    
  • 你忘记到在初始化之前维度数组。 在下面的示例中,values被声明为一个整数数组,但永远不会指定它所包含的元素的数目。 尝试初始化因此引发其值NullReferenceException异常。

    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()
    

    通过在进行初始化之前声明的数组中的元素数,下面的示例一样,可以消除此异常。

    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
    

    声明和初始化数组的详细信息,请参阅数组(C# 编程指南)Visual Basic 中的数组

  • 你获取null从方法返回,返回值,然后在返回的类型上调用方法。 这有时是由错误引起的文档;文档将失败,需要注意的方法调用可以返回null 在其他情况下,你的代码错误地假定该方法将始终返回非null值。

    下面的示例中的代码假定Array.Find<T>方法始终返回Person对象,其FirstName字段匹配的搜索字符串。 由于没有任何匹配项,则运行时会引发NullReferenceException异常。

    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()
    

    若要解决此问题,测试方法的返回值,以确保它不是null之前调用任何的成员,如以下示例执行。

    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
    
  • 要使用表达式 (例如,要链接的方法或属性列表在一起) 来检索一个值,尽管你要检查的值是否null,运行时仍会引发NullReferenceException异常。 发生这种情况是因为其中一个表达式中的中间值返回null 因此,你其余部分null从不进行计算。

    下面的示例定义Pages缓存 web 页,它们提供的有关信息的对象Page对象。 Example.Main方法检查是否当前的 web 页具有非 null 标题,如果是这样,显示的标题。 尽管此检查,但是,该方法将引发NullReferenceException异常。

    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()
    

    引发异常,因为pages.CurrentPage返回null如果没有页信息存储在缓存中。 可以通过测试的值来解决此异常CurrentPage之前检索当前的属性Page对象的Title属性,如下面的示例未︰

    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.
    
  • 要枚举的一个数组,包含引用类型,以及到进程的元素的一个引发你尝试元素NullReferenceException异常。

    下面的示例定义的字符串数组。 Afor语句枚举数组中的元素,并调用每个字符串Trim方法,然后才能显示字符串。

    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()
    

    如果你假定数组的每个元素必须包含非 null 值,而数组元素的值中的事实是,则会发生此异常null 元素是否是,可以进行测试,以消除异常null然后再执行针对该元素的任何操作,如下面的示例所示。

    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
    
  • ANullReferenceException传递的方法引发异常null 某些方法验证传递给它们的自变量。 如果它们,并且其中一个自变量是null,该方法将引发System.ArgumentNullException异常。 否则,它会引发NullReferenceException异常。 下面的示例阐释了这种情况。

    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()
    

    若要解决此问题,请确保传递给方法的参数不是null,或处理中引发的异常try…catch…finally块。 有关详细信息,请参阅处理和引发异常

The following Microsoft intermediate language (MSIL) instructions throw NullReferenceException: callvirt, cpblk, cpobj, initblk, ldelem.<type>, ldelema, ldfld, ldflda, ldind.<type>, ldlen, stelem.<type>, stfld, stind.<type>, throw, and unbox.

NullReferenceException使用 HRESULT COR_E_NULLREFERENCE,其值 0x80004003。

有关的实例的初始属性值的列表NullReferenceException,请参阅NullReferenceException构造函数。

处理发行代码中的 NullReferenceException

通常,最好避免 NullReferenceException 比处理后发生。 处理异常会导致代码更难维护和理解,并且有时会引入其他 bug。 NullReferenceException 通常为不可恢复的错误。 在这些情况下,让异常停止应用可能是最佳替代方法。

然而,在许多情况下,处理错误可能非常有用:

  • 你的应用可以忽略为 null 的对象。 例如,如果你的应用检索并处理数据库中的记录,则你可以忽略一些导致 null 对象的错误记录。 你可能仅需在日志文件或应用程序 UI 中记录错误数据。

  • 可以从异常中恢复。 例如,在连接丢失或连接超时的情况下,对返回引用类型的 Web 服务的调用可能会返回 null。 可尝试重新建立连接并再次尝试调用。

  • 可将你的应用状态还原到有效状态。 例如,你可能要执行多步骤的任务,该任务需要你在调用引发 NullReferenceException 的方法之前将信息保存到数据存储。 如果未初始化的对象可能会损坏数据记录,你可以在关闭应用之前删除之前的数据。

  • 你需要报告异常。 例如,如果该错误由应用用户的某个错误引起,你可以生成一条可帮助该用户提供正确信息的消息。 你还可以记录有关该错误的信息来帮助你解决此问题。 某些框架(如 ASP.NET)具有高级别的异常处理程序,该处理程序可捕获所有错误,以便应用永远不会发生崩溃,在这种情况下,记录异常可能是你用来了解是否发生异常的唯一方式。

通用 Windows 平台
自 8 起可用
.NET Framework
自 1.1 起可用
可移植类库
可移植 .NET 平台 中受支持
Silverlight
自 2.0 起可用
Windows Phone Silverlight
自 7.0 起可用
Windows Phone
自 8.1 起可用

此类型的所有公共静态(Visual Basic 中的 已共享 在 Visual Basic 中)成员都是线程安全的。不保证所有实例成员都是线程安全的。

返回页首
显示: