咨询:如何处理Car自定义项查询中的NullReferenceException异常?
解决空引用异常的安全处理方案
嘿,看来你这是碰到了LINQ查询里的空引用坑对吧?咱们先把问题拆解清楚,再给你几个靠谱的解决办法。
首先得搞明白,你的代码var customizationToBeUpdated = car.Customizations.FirstOrDefault(pv => pv.Versions.Any(ver => ver.Name.Contains("xyz")));会抛出System.NullReferenceException,大概率是链路上某个环节出现了null:
car本身可能是null,直接访问car.Customizations就炸了car.Customizations可能是null,调用FirstOrDefault自然报错- 某个
pv(Customization实例)是null,访问pv.Versions肯定出问题 pv.Versions可能是null,调用Any方法直接触发异常- 某个
ver(Version实例)是null,访问ver.Name也会报错
接下来给你几个实用的修复方案,按需选择:
方案一:用空条件+空合并运算符做链式防护
这是最简洁的写法,适合追求代码紧凑的场景:
var customizationToBeUpdated = car?.Customizations?.FirstOrDefault(pv => pv?.Versions?.Any(ver => ver?.Name?.Contains("xyz") ?? false) ?? false);
逐个解释下每个防护点:
car?.Customizations:如果car是null,直接返回null,不会继续往下走pv?.Versions:当前Customization实例为null时,返回nullver?.Name:当前Version实例为null时,返回nullver?.Name?.Contains("xyz") ?? false:如果Name是null,Contains返回null,用?? false把它转成false,保证Any能正常判断pv?.Versions?.Any(...) ?? false:如果Versions是null,Any返回null,同样转成false,这样这个pv不会被匹配到
方案二:提前显式做空值检查,可读性拉满
如果你更看重代码的可读性,让后续维护的人一眼就能看懂空值判断逻辑,可以用这种写法:
var customizationToBeUpdated = null as Customization; // 先检查最外层的空值 if (car != null && car.Customizations != null) { customizationToBeUpdated = car.Customizations.FirstOrDefault(pv => pv != null && pv.Versions != null && pv.Versions.Any(ver => ver != null && ver.Name?.Contains("xyz") == true)); }
这里把每个可能的空值点都明确做了检查,逻辑清晰,不容易出错。
方案三:从根源减少空集合,初始化默认值
如果你的项目允许修改类定义,建议在类里直接初始化集合,从根源上避免集合为null的情况:
public class Car { // 初始化空列表,避免Customizations为null public List<Customization> Customizations { get; set; } = new List<Customization>(); } public class Customization { // 初始化空列表,避免Versions为null public List<Version> Versions { get; set; } = new List<Version>(); }
这样一来,默认情况下集合都是空列表而不是null,你的原始代码只需要补充对ver和car的空检查就可以了:
var customizationToBeUpdated = car?.Customizations.FirstOrDefault(pv => pv != null && pv.Versions.Any(ver => ver != null && ver.Name.Contains("xyz")));
最后再提醒一句:FirstOrDefault在没有匹配项时会返回null,所以后续使用customizationToBeUpdated的时候,别忘了也做个null检查哦!
内容的提问来源于stack exchange,提问作者CidaoPapito
相关产品推荐
相关产品推荐

