Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在调试模式下链接方法时找出NullReferenceException的原因?_C#_Visual Studio_Debugging - Fatal编程技术网

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()
并重新评估。继续,直到找到空值。或者,临时重写,直到发现错误。