我们的应用程序遇到了这个大问题。这是一个相当大的应用程序,有几个模块和成千上万行代码。应用程序的很多部分都设计为仅在引用另一个对象时存在,例如,没有 House 对象,Person 对象永远不会存在,因此如果您在应用程序中的任何时候说:
bool check = App.Person.House == null;
check
应始终为 false
(按设计),因此,为了继续使用该示例,在创建模块、测试、调试时,App.Person.House 永远不会null,但是一旦我们将应用程序发送给我们的客户,他们就开始收到一堆 NullReferenceException
,这些对象在设计上永远不应该有 null 引用。他们告诉我们错误,我们尝试在这里重现它,但 90% 的时候我们不能,因为在这里它工作正常。
该应用程序是用 C# 和 WPF 开发的,按照设计,它只能在 Windows XP SP 3 和 .net Framework v3.5 上运行,因此我们知道用户拥有相同的操作系统、服务包和.net 框架版本,就像我们在这里做的那样,但他们仍然得到我们无法重现的奇怪的 NullReferenceExceptions
。
所以,我只是想知道以前是否有人见过这个问题以及您是如何修复它的,我们的应用程序每天至少在 5 台不同的计算机上运行 8 小时,而且我们从未见过这些异常,这只会发生在客户出于某种原因。
任何想法、任何线索、任何可以使我们更接近解决此问题的解决方案都将不胜感激。
谢谢!
最佳答案
好吧,您并没有真正告诉我们很多关于房屋属性(property)的信息……它是可写的吗?如果是这样,请将验证放入 setter 中,如果值为 null,至少 会记录 - 理想情况下立即抛出 ArgumentNullException
(我相信通常最好在数据为空时停止腐败而不是继续并希望生活会自行解决)。如果它只是设置为构造函数中的支持字段,请在那里检查它 - 如果它为 null,则再次抛出 ArgumentNullException
。
如果它是以某种方式计算的,那就更难了——那时你应该在 getter 和日志中测试(以某种方式让你的客户很容易将信息返回给你)尽可能多的信息您认为可能相关。
编辑:正如已经指出的那样,这可以应用于表达式中的任何级别 - 因此您可能希望对每个级别应用相同类型的验证和日志记录。
关于.net - .net 中的空引用异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2931649/