找不到为什么会出现空引用异常

4
以下是代码和有问题的行。
当我用鼠标悬停在 src.EnergyServiceLevel 上时,它显示为 null。如果我在上一行中检查 null,那怎么可能呢?
我的猜测是可能有线程导致问题,所以我添加了锁,但并没有帮助。
public static ServiceLevelsGroup SafeClone(this ServiceLevelsGroup src) {
  ServiceLevelsGroup res = null;
  lock (_locker) {
    if (src != null) {
      res = new ServiceLevelsGroup();
      if (src.EnergyServiceLevel != null) {
        res.EnergyServiceLevel = new ServiceLevelInfo { ServiceGrade = src.EnergyServiceLevel.ServiceGrade };

        if (src.EnergyServiceLevel.Reason != null)
          res.EnergyServiceLevel.Reason = src.EnergyServiceLevel.Reason;
      }
    }
  }

  return res;
}

在上面的代码中,异常发生在res.EnergyServiceLevel = ...行。

以下是调试模式下异常发生的截图:

调试时异常的截图


2
你能否将代码复制到帖子中,而不是发布图片?文字太小了,无法阅读。 - hammar
2
请同时发布异常详细信息。 - Codo
1
@hammar:你可以直接观看图片以获得全尺寸视图。 - Arseni Mourzenko
1
你确定你正在正确使用调试器吗? - Euphoric
1
能源服务级别是一个属性吗?getter可能会有一个副作用,这个副作用可能会被你的调试鼠标悬停触发。 - hsmiths
显示剩余3条评论
3个回答

2

您的代码显示lock(_locker) - 因此看起来您正在多线程环境中。您能否检查是否有其他内容将变量设置为NULL?即,是否所有其他内容也正确调用了lock(_locker)


+1 如果你不锁定setter,那么锁是没有用的。然而,由于OP正在定义扩展方法,他/她可能无法访问原始代码。 - brianpeiris
我认为你离真相最近,等我再次开始工作时,我会检查一下,也许我在代码的其他部分没有正确锁定。 - Erez
谢谢 - 如果这不是一个锁定问题,那么请使用“查看详细信息”并查看异常的调用堆栈 - 它可能只是在属性评估中的某个地方。 - Stuart

1
也许你的 NULL 在 res.EnergyServiceLevel

这不会导致 NullReferenceException。 - BrokenGlass

0

src.EnergyServiceLevel.ServiceGrade 可能为空。

将鼠标指针移动到每个引用上,可以准确地显示哪个为空。


这不会导致 NullReferenceException。 - BrokenGlass
赋值为 null 是完全合法的。 - BrokenGlass

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