【问题标题】:Figuring out cause of NullReferenceException when chaining methods, in debugging mode?在调试模式下,在链接方法时找出 NullReferenceException 的原因?
【发布时间】:2017-09-07 19:42:28
【问题描述】:

假设你有这样的代码:

Human mario = HumanFactory.CreateRandomHuman();

Console.WriteLine(mario.GetFamily().GetFather().GetEyeColor());

假设你在调试模式下运行它,它显示该行得到一个System.NullReferenceException,错误消息'Object reference not set to an instance of an object.' 但你实际上并不知道哪个对象是空的。

有没有办法知道 Visual Studio 中实际上是哪个对象导致了引用异常?调试器只是将整行显示为导致异常,但您不知道mario 是否为null,或者GetFamily() 是否返回null,或者GetFather() 是否返回null,等等。

在过去,我只是将它分解成单独的行并逐步遍历它们,直到我得到 null 异常,但必须有一种更简单的方法来做到这一点,而不涉及破坏链。

【问题讨论】:

  • 嗯,实际上在 VS 2017 中,未处理的异常弹出窗口告诉我哪个调用返回 null。这很方便!让我检查一下 2012 年......不,2012 年没有这样做。
  • 选择Mario,右键,快速观看。在 Quickwatch 窗口中,添加 .GetFamily() 并重新评估。继续直到找到空值。或者,暂时重写,直到发现错误。

标签: c# visual-studio debugging


【解决方案1】:

您可能可以通过在选择部分表达式Mario.GetFamily()Mario.GetFamily().GetFather() 等后按 Shift-F9 来完成。

但是你的代码中有一个错误,所以先修复它,事情会容易得多:

  • 您的 GetXXX() 方法都不应该返回 null,在这种情况下,至少有一个方法不遵守此约束。在每个方法中添加断点,找出哪个是有问题的方法,并修复它;

  • 或者没有这样的保证,在这种情况下,您上面的代码应该测试每个方法返回的 null。如果您使用的是 C#6,则有一个方便的快捷方式:

    mario.GetFamily()?.GetFather()?.GetEyeColor()
    

【讨论】:

    【解决方案2】:

    在 IDE 中引发异常时,在 Mario 上使用“快速观察”(Shift-F9)。 在 Quickwatch 窗口中,您可以重复构建链并在每次添加后重新评估,以查看何时返回 null。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-21
      • 1970-01-01
      • 1970-01-01
      • 2021-11-12
      相关资源
      最近更新 更多