什么是NullReferenceException的含义?

3

可能是重复问题:
什么是 .NET 中的 NullReferenceException?

例如,"System.NullReferenceException 未经处理,错误信息为“对象引用未设置为对象的实例”。

这个异常的含义是什么,如何解决?

6个回答

14
这意味着您尝试访问不存在的成员:
string s = null;
int i = s.Length; // boom

只需修复空值问题。要么使其非空,要么先进行空值测试。

这里还涉及到边角情况,与Nullable<T>、泛型和new泛型约束有关 - 尽管可能性很小(但我遇到了这个问题!)。


8

这是.NET中最常见的异常...它意味着你试图调用一个未初始化(null)的变量的成员。在调用其成员之前,您需要初始化此变量。


1
请注意,以下建议适用于“字段”(实例/静态变量)-但不适用于局部变量(明确分配应用于局部变量;您甚至不能尝试使用未初始化的局部变量)。 - Marc Gravell

2
这意味着您正在引用一个空值(null),例如:null
class Test
{

   public object SomeProp
   {
      get;
      set;
   }

}

new Test().SomeProp.ToString()

SomeProp将为null,并且应该抛出NullReferenceException。这通常是由于您调用的代码期望有某些东西存在,但实际上不存在。


如果o是一个局部变量,这段代码将无法编译。未赋值的局部变量不是null - CodesInChaos
你说得对,我已经修改了这个例子。 - Lloyd

1
这意味着您尝试在变量尚未初始化时使用对象的方法或属性:
string temp;
int len = temp.Length; // throws NullReferenceException; temp is null

string temp2 = "some string";
int len2 = temp2.Length; // this works well; temp is a string

对于局部变量(如所示的示例),它已经被初始化(否则它将无法编译)。简单地说:它被初始化为null。 - Marc Gravell
1
如果“temp”是一个局部变量,它将 不会 编译。如果是一个字段,它将为 null。 - H H

1
以下代码将显示异常和提示。
string s = null;
s = s.ToUpper();

1

在你的代码中,你有一个对象引用,但它没有设置为对象的实例 :)

你在某个地方使用了一个对象,但没有调用它的构造函数。

你应该做什么:

MyClass c = new MyClass();

你做了什么:

MyClass c;
c.Blah();

1
哪些代码无法编译...(明确赋值) - Marc Gravell
你说得对,他们也不会有我的MyClass实现。那我们就这样做吧: Random r = null; r.Next(); - Matt Jacobsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接