C# 在调试模式下链接方法时找出NullReferenceException的原因?
假设您有这样的代码:C# 在调试模式下链接方法时找出NullReferenceException的原因?,c#,visual-studio,debugging,C#,Visual Studio,Debugging,假设您有这样的代码: Human mario = HumanFactory.CreateRandomHuman(); Console.WriteLine(mario.GetFamily().GetFather().GetEyeColor()); 假设您在调试模式下运行它,它显示该行获取了一个System.NullReferenceException,错误消息为“对象引用未设置为对象的实例”。,但实际上您不知道哪个对象为null 有没有办法知道Visual Studio中哪个对象实际导致了引用
Human mario = HumanFactory.CreateRandomHuman();
Console.WriteLine(mario.GetFamily().GetFather().GetEyeColor());
假设您在调试模式下运行它,它显示该行获取了一个System.NullReferenceException
,错误消息为“对象引用未设置为对象的实例”。
,但实际上您不知道哪个对象为null
有没有办法知道Visual Studio中哪个对象实际导致了引用异常?调试器只显示导致异常的整行代码,但您不知道mario
是否为null,或者GetFamily()
是否返回null,或者GetFather()
是否返回null,等等
在过去,我只是将它分解成单独的行,并逐步遍历它们,直到得到null异常,但必须有一种更简单的方法来完成,而不需要分解链。在选择表达式的一部分
Mario.GetFamily()
<,或者Mario.GetFamily().GetFather()
等等
但是您的代码中有一个bug,所以首先修复它,事情就会简单得多:
- 要么GetXXX()方法永远不应该返回null,在这种情况下,至少有一个方法不遵守此约束。在每个方法中添加一个断点,找出哪一个方法有问题,并修复它
- 或者没有这样的保证,在这种情况下,上面的代码应该测试每个方法返回的null。如果您使用的是C#6,有一个方便的快捷方式:
mario.GetFamily()?.GetFather()?.GetEyeColor()
Mario.GetFamily()
或Mario.GetFamily().GetFather()等后按Shift-F9来执行此操作
但是您的代码中有一个bug,所以首先修复它,事情就会简单得多:
- 要么GetXXX()方法永远不应该返回null,在这种情况下,至少有一个方法不遵守此约束。在每个方法中添加一个断点,找出哪一个方法有问题,并修复它
- 或者没有这样的保证,在这种情况下,上面的代码应该测试每个方法返回的null。如果您使用的是C#6,有一个方便的快捷方式:
mario.GetFamily()?.GetFather()?.GetEyeColor()
在IDE中引发异常时,对Mario使用“快速监视”(Shift-F9)。
在Quickwatch窗口中,您可以重复构建链,并在每次添加后重新计算,以查看何时返回空值 在IDE中引发异常时,对Mario使用“快速监视”(Shift-F9)。
在Quickwatch窗口中,您可以重复构建链,并在每次添加后重新计算,以查看何时返回空值 嗯,实际上在VS2017中,未处理的异常弹出窗口告诉我哪个调用返回空值。那很方便!让我查一查2012。。。不,2012不会这样做。选择Mario
,右键单击,快速观看。在Quickwatch窗口中,添加.GetFamily()
并重新评估。继续,直到找到空值。或者,临时重写,直到发现bug。嗯,实际上在VS2017中,未处理的异常弹出窗口告诉我哪个调用返回null。那很方便!让我查一查2012。。。不,2012不会这样做。选择Mario
,右键单击,快速观看。在Quickwatch窗口中,添加.GetFamily()
并重新评估。继续,直到找到空值。或者,临时重写,直到发现错误。