我们的应用程序遇到了这个大问题.它是一个相当大的应用程序,包含几个模块,以及成千上万行代码.应用程序的很多部分只是在引用另一个对象时才存在,例如,如果没有House对象,Person对象永远不会存在,所以如果你在应用程序的任何一点说:
bool check = App.Person.House == null;
Run Code Online (Sandbox Code Playgroud)
check应始终是false(设计),因此,继续使用这个例子中,在创建模块,测试,调试,App.Person.House永远不能为null,但是一旦我们发货的应用我们的客户,他们开始得到了一堆NullReferenceException用设计中的对象永远不应该有空引用.他们告诉我们这个bug,我们尝试在这里重现它,但是90%的时间我们都不能,因为这里工作正常.
该应用程序正在使用C#和WPF进行开发,并且在设计上,它仅在Windows XP SP 3和.net框架v3.5上运行,因此我们知道用户具有相同的操作系统,Service Pack和.net框架就像我们在这里做的那样,但他们仍然NullReferenceExceptions觉得我们无法重现这种奇怪.
所以,我只是想知道是否有人之前已经看过这个以及你如何修复它,我们在5台不同的计算机上每天至少运行8个小时的应用程序,我们从未看到这些异常,这只发生在客户端某些原因.
任何想法,任何线索,任何可以让我们更接近解决这个问题的解决方案将不胜感激.
谢谢!
Jon*_*eet 10
好吧,你还没有真正告诉我们关于众议院的财产......它是否可写?如果是这样,将验证放入setter中,如果值为null ,则至少记录 - 并且理想情况下ArgumentNullException立即抛出(我认为通常更好的是当数据损坏而不是继续时停止并希望生命将自行排除).如果它只是在构造函数中设置为支持字段,请在那里检查 - ArgumentNullException如果它为null则再次抛出.
如果它以某种方式计算,那就更难了 - 在这一点上你应该在getter和log中测试(以某种方式让你的客户很容易将信息传回给你),尽可能多的信息你认为可能相关.
编辑:正如已经指出的,这可以适用于表达式中的任何级别 - 因此您可能希望对每个级别应用相同类型的验证和日志记录.
这条线
bool check = App.Person.House == null;
Run Code Online (Sandbox Code Playgroud)
当App或者App.Person为null 时,将抛出null-ref异常.
你说'设计不能为空'但是无法从你的描述中验证.很明显,用户只需遵循程序中未包含在测试用例中的路径即可.
如果您无法发现设计中的缺陷,那么实际的方法是通过内部检查扩展您的应用程序.我会推荐一个好的追踪系统和(很多)System.Diagnostics.Trace.Assert(xx != null);