为何我的异步程序抛出NullReferenceException异常?
解决System.NullReferenceException异常的思路
咱先拆解下这个问题:System.NullReferenceException是.NET开发里碰得最多的异常之一,说白了就是你代码里有个对象是null(没被实例化),但你却直接去调用它的属性、方法或者索引器了,系统自然就报错了。
从报错信息来看,异常出现在GoogleProducts.Program.<Main>d__0.MoveNext()的第60行,也就是你异步的Main方法里的某一行代码。给你几个具体的排查和解决步骤:
第一步:定位问题代码
打开你的Program.cs,直接跳到第60行,找出所有形如对象.成员(比如product.Id、service.GetData())的代码,这些就是潜在的触发点。第二步:排查哪个对象是null
逐个检查这些对象:- 是不是你只声明了对象,但没通过
new关键字实例化?比如只写了GoogleProduct product;,没写成GoogleProduct product = new GoogleProduct(); - 是不是某个异步方法(比如你调用的谷歌产品相关接口)返回了
null?比如await GetProductAsync()没拿到数据,返回了null,你直接就去访问它的成员了 - 是不是某个变量被意外赋值为null了?比如之前的逻辑里有
product = null;的操作,后续没做判断就用了
- 是不是你只声明了对象,但没通过
第三步:添加空值保护
找到null的对象后,用这些方式避免异常:- 显式空判断:
var product = await GetGoogleProductAsync(); if (product != null) { // 安全访问product的成员 Console.WriteLine(product.Title); } - 使用C#空条件运算符
?.:var product = await GetGoogleProductAsync(); // 如果product是null,这行代码会返回null,不会触发异常 Console.WriteLine(product?.Title); - 用空合并运算符
??给默认值:var product = await GetGoogleProductAsync() ?? new GoogleProduct(); // 即使返回null,也会用新实例,避免后续报错 Console.WriteLine(product.Title);
- 显式空判断:
调试小技巧
直接在第60行打个断点,运行程序到这里时,把鼠标悬停在各个对象上,就能看到哪个对象是null,一下子就能定位到问题根源。
内容的提问来源于stack exchange,提问作者Test45
相关产品推荐
相关产品推荐

