"对象引用未设置为对象的实例"是什么意思?

moh*_*eza 182 .net nullreferenceexception

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

你调用的对象是空的.

Iai*_*ain 160

.NET中的变量是引用类型或值类型.值类型是原语,例如整数布尔值 或结构(并且可以识别,因为它们从System.ValueType继承).声明时,布尔变量具有默认值:

bool mybool;
//mybool == false
Run Code Online (Sandbox Code Playgroud)

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

class ExampleClass
{
}

ExampleClass exampleClass; //== null
Run Code Online (Sandbox Code Playgroud)

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

以下代码是一种简单的再现方式:

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()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一个非常常见的错误,可能因各种原因而发生.根本原因实际上取决于您遇到的具体情况.

如果您正在使用API​​或调用可能返回null的方法,那么优雅地处理它是很重要的.可以修改上面的主要方法,以便用户永远不会看到NullReferenceException:

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();
}
Run Code Online (Sandbox Code Playgroud)

所有上述内容实际上只是.NET类型基础知识的提示,有关详细信息,我建议您通过C#获取CLR或者阅读同一作者的这篇MSDN文章 - Jeffrey Richter.还可以查看更复杂的例子,了解何时遇到NullReferenceException.

一些使用Resharper的团队利用JetBrains属性来注释代码,以突出显示(非)预期的空位.

  • 如果我在另一个类中有一个列表怎么办,如下所示:https://pastebin.com/aWhfu8UM。我收到“运行时异常(第 9 行):未将对象引用设置为对象的实例。”错误 (2认同)

Jay*_*Jay 20

另一个简单的方法来获得这个:

 Person myPet = GetPersonFromDatabase();
 // check for myPet == null... AND for myPet.PetType == null
 if ( myPet.PetType == "cat" ) <--- fall down go boom!
Run Code Online (Sandbox Code Playgroud)

  • Jay 的回答展示了另一个示例,此处的任何其他回答均未涵盖该示例。 (2认同)

小智 17

简而言之,它意味着..您正在尝试访问一个对象而不实例化它.您可能需要使用"new"关键字首先实例化它,即创建它的实例.

例如:

public class MyClass
{
   public int Id {get; set;}
}

MyClass myClass;

myClass.Id = 0; <----------- An error will be thrown here.. because myClass is null here...
Run Code Online (Sandbox Code Playgroud)

你将不得不使用:

myClass = new MyClass();
myClass.Id = 0;
Run Code Online (Sandbox Code Playgroud)

希望我说清楚..


dkp*_*att 10

不要生硬,但这正是它所说的.您的一个对象引用是NULL.当您尝试访问NULL'd对象的属性或方法时,您会看到这一点.

  • 如果您知道对象是什么,参考和实例......在编程时所有非常有用的单词,它就意味着它所说的内容. (30认同)
  • 他可以做新的NullReferenceException(); 大声笑... (3认同)

J.W*_*.W. 5

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

Class myObject = GetObjectFromFunction();
Run Code Online (Sandbox Code Playgroud)

没有

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