C#报错”System.NullReferenceException”的原因以及解决办法

  • Post category:C#

当C#程序运行时,当一个引用变量的值为Null时,如果尝试使用它的属性、方法或字段,就会触发System.NullReferenceException异常。这时程序会抛出异常并停止执行,导致整个应用程序崩溃。这种异常一般是由于程序员在访问对象成员之前未对该对象进行初始化或实例化造成的。

解决这种异常的方法有以下几种:

1. 确定空引用变量并进行初始化

当使用引用类型时,确定被引用的对象是否为空并进行初始化。这样可以避免 NullReferenceException。例如,下面代码的str变量没有初始化,所以调用它的ToLower()方法时会抛出NullReferenceException异常。

string str;
string s = str.ToLower(); //报了NullReferenceException异常

下面代码将给str变量赋值为”test”,避免了因未初始化而引发异常的问题。

string str = "test";
string s = str.ToLower(); //正常执行

2.使用C#的“空合并运算符”或条件语句进行非空判断

C#提供了一个“空合并运算符”(??)和一个条件语句,可以方便验证变量是否为Null,避免引发NullReferenceException异常。

下面代码使用“空合并运算符”避免了因为left可能是null而引发System.NullReferenceException异常的问题。

int? left = null;
int result = (left ?? 0) + 10;  //等同于int result = (left == null ? 0 : left.Value) + 10;
Console.WriteLine(result);

下面代码使用if进行非空判断,避免了因list变量为null而引发System.NullReferenceException异常的问题。

List<string> list = null;
if (list != null && list.Count > 0)  //先进行非空判断
{
    Console.WriteLine(list[0]);
}

以上两种方法都能有效避免因引用变量为Null而引发的NullReferenceException异常。但一般情况下,采用第一种方法初始化变量会更好,因为第二种方法不容易看出是否已经完全保证了非空。