奇怪的对象空引用异常

时间:2016-05-18 09:47:19

标签: c# linq

我有一个带有日志文件的Windows服务来编写捕获的任何异常。在使用LINQ的简单foreach中,我得到了经典的例外:

Object reference not set to an instance of an object.

但是,当我在本地运行代码时,通过“冻结”Windows服务代码并仅通过Main函数运行代码,我似乎无法复制此问题。堆栈跟踪表示导致问题的行是142。

var newTickets = tickets
    .Where(t => t != null)
    .Where(t => (DateTime)t.LastActivityDate >= lastAutoTaskSync); 

foreach(Ticket ticket in newTickets) //Line 142

奇怪的是,通过添加以下几行,我已经检查了所有可能的事情:

var newTickets = tickets
    .Where(t => t != null)
    .Where(t => (DateTime)t.LastActivityDate >= lastAutoTaskSync);

if (newTickets == null) throw new Exception("newTickets is null");
if (tickets == null) throw new Exception("tickets is null");
if (lastAutoTaskSync == null) throw new Exception("date is null");

foreach (Ticket ticket in newTickets)

同样,同一行引发同样的异常。

我可能遗失了什么,或者可能导致此异常的事情吗?我认为它可能是LINQ中的代码,例如LastActivityDate为空,但如果是这样的话,那肯定会抛出异常的行,而不是foreach本身?

要添加,代码会在大约50%的时间内运行,在foreach内运行时没有任何问题。例如,服务日志指示循环中的代码运行3或4次,然后异常命中第5次。

1 个答案:

答案 0 :(得分:1)

堆栈跟踪报告错误的行号,导致我相信LINQ查询导致异常。实际上,异常是在foreach循环中抛出的,几行向下,我尝试访问Ticket属性中的对象,该对象为null。

经验教训,不要完全相信并完全依赖堆栈跟踪!