【问题标题】:Seeing WHICH object reference caused a NullReferenceException查看 WHICH 对象引用导致 NullReferenceException
【发布时间】:2010-11-17 00:41:33
【问题描述】:

在使用 Visual Studio 调试 C# 时,是否可以查看给定代码行上的哪个对象引用导致了 NullReferenceException?

我遇到了一种奇怪的情况,有时,当从 Visual Studio 运行应用程序的调试版本时,我会在某行收到 NullReferenceException。

Visual Studio 将弹出指向该行的异常助手框,但该行上使用的 3 个对象引用此时都不是 null。


该行是:

myClassInstance.myMethod(myOtherClassInstance.IPAddressInstance.ToString());

我的两个类实例都是非空的,IPAddress 实例也是如此(它有它的预期值)。

【问题讨论】:

  • 听起来您的符号和代码可能不匹配。重建调试配置。
  • @John 可能不会,VS.NET 会立即警告您源与加载的模块不同。
  • 如果没有调试符号,就没有那么多了。
  • 从上面“[...] 运行调试构建时 [...]”

标签: c# .net visual-studio debugging exception


【解决方案1】:

小心返回空对象的函数。这让我有一次,在调试器中不是很清楚。看看这个:

public class FooBar
{
    public int ReturnInt() { return 0; }
}

public FooBar ReturnNullObject()
{
    return null;
}

// Execution code:
int exceptionalInt = ReturnNullObject().ReturnInt();

编辑:根据您的编辑,确保 IPAddressInstance 没有返回 null。

编辑:您可能希望将单行分成几行。这应该会有所帮助。

var ip = myOtherClassInstance.IPAddressInstance;
var ipString = ip.ToString();
myClassInstance.myMethod(ipString);

【讨论】:

    【解决方案2】:

    如果您正在调用标有[DebuggerNonUserCode] 属性的代码,则问题可能出在框架代码中,而不是在那一行。

    无论如何,您有可以发布的具体示例吗?

    【讨论】:

    • 用这行更新了问题。
    【解决方案3】:

    在执行“step-into”时在该行设置断点,直到获得 NRE。

    没有魔法,对吧?一些代码尝试取消引用null

    即使你像 A.Property.Property2.ToString() 那样做,因为 Visual Studio 说它们都不是空的,问题出在 ToString() 方法中,它位于程序集中,Visual Studio 没有进入调试。

    【讨论】:

      猜你喜欢
      • 2015-04-27
      • 1970-01-01
      • 2010-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-12
      相关资源
      最近更新 更多