让我们说你有这样的代码:
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,等等
在过去,我只是把它分解成单独的行并逐步完成它们,直到我得到空的例外,但是必须有一个更简单的方法来做到这一点并不是涉及打破链条。
答案 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的时间。