关于.NET: “Object reference not set to an instance of an object” 是什么意思?

What does “Object reference not set to an instance of an object” mean?

本问题已经有最佳答案,请猛点这里访问。

我收到这个错误,我不确定它是什么意思?

Object reference not set to an instance of an object.


.NET中的变量是引用类型或值类型。值类型是诸如整数、布尔值或结构之类的基元(可以标识,因为它们继承自System.ValueType)。布尔变量在声明时具有默认值:

1
2
bool mybool;
//mybool == false

引用类型在声明时没有默认值:

1
2
3
4
5
class ExampleClass
{
}

ExampleClass exampleClass; //== null

如果尝试使用空引用访问类实例的成员,则会得到System.NullReferenceException。与未设置为对象实例的对象引用相同。

以下代码是一种简单的复制方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
static void Main(string[] args)
{
    var exampleClass = new ExampleClass();
    var returnedClass = exampleClass.ExampleMethod();
    returnedClass.AnotherExampleMethod(); //NullReferenceException here.
}

class ExampleClass
{
    public ReturnedClass ExampleMethod()
    {
        return null;
    }
}

class ReturnedClass
{
    public void AnotherExampleMethod()
    {
    }
}

这是一个非常常见的错误,可能由于各种原因而发生。根本原因实际上取决于您遇到的特定场景。

如果您使用的是API或调用可能返回空值的方法,那么必须优雅地处理它。可以修改上面的主要方法,这样用户就不会看到NullReferenceException:

1
2
3
4
5
6
7
8
9
10
11
12
13
static void Main(string[] args)
{
    var exampleClass = new ExampleClass();
    var returnedClass = exampleClass.ExampleMethod();

    if (returnedClass == null)
    {
        //throw a meaningful exception or give some useful feedback to the user!
        return;
    }

    returnedClass.AnotherExampleMethod();
}

以上所有内容都只是.NET类型基本原理的提示,对于进一步的信息,我建议您通过C获取clr,或者阅读同一作者Jeffrey Richter的这篇msdn文章。另外,更复杂的例子是,当您遇到NullReferenceException时。

一些使用Resharper的团队使用JetBrains属性对代码进行注释,以突出需要(不是)空值的地方。


另一个简单的方法是:

1
2
3
 Person myPet = GetPersonFromDatabase();
 // check for myPet == null... AND for myPet.PetType == null
 if ( myPet.PetType =="cat" ) <--- fall down go boom!


简而言之,这意味着……您试图在不实例化对象的情况下访问该对象。您可能需要首先使用"new"关键字来实例化它,即创建它的实例。

例如:

1
2
3
4
5
6
7
8
public class MyClass
{
   public int Id {get; set;}
}

MyClass myClass;

myClass.Id = 0; <----------- An error will be thrown here.. because myClass is null here...

您必须使用:

1
2
myClass = new MyClass();
myClass.Id = 0;

希望我说的清楚。


不要直截了当,但它的意思正是它所说的。对象引用之一为空。当您尝试访问一个空对象的属性或方法时,您会看到这一点。


这意味着你做了这样的事。

1
Class myObject = GetObjectFromFunction();

而且不做

if(myObject!=null),你去做myObject.Method();


如果我有课:

1
2
3
4
5
6
7
public class MyClass
{
   public void MyMethod()
   {

   }
}

然后我这样做:

1
2
MyClass myClass = null;
myClass.MyMethod();

第二行引发此异常,因为我正在对引用类型对象(即null未通过调用myClass = new MyClass()实例化)调用方法。


大多数情况下,当您试图将值赋给对象时,如果该值为空,则会发生这种异常。请检查此链接。

为了自学,你可以设置一些检查条件。喜欢

1
2
if (myObj== null)
Console.Write("myObj is NULL");

what does this error mean? Object reference not set to an instance of an object.

正如它所说,您试图使用一个空对象,就好像它是一个正确的引用的对象。