在调试模式下链接方法时找出NullReferenceException的原因?

时间:2017-09-07 19:42:29

标签: c# visual-studio debugging

让我们说你有这样的代码:

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是否为空,或者GetFamily()是否返回null,或者GetFather()是否返回null,等等

在过去,我只是把它分解成单独的行并逐步完成它们,直到我得到空的例外,但是必须有一个更简单的方法来做到这一点并不是涉及打破链条。

2 个答案:

答案 0 :(得分:1)

您可以在选择部分表达式Mario.GetFamily()Mario.GetFamily().GetFather()等后按Shift-F9来执行此操作。

但是你的代码中有一个错误,所以先解决这个问题,事情会更容易:

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

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

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

答案 1 :(得分:1)

在IDE中抛出异常时,请使用' Quick Watch' (Shift-F9)马里奥。 在Quickwatch窗口中,您可以重复构建链并在每次添加后重新评估,以查看返回null的时间。