我有一个asp.net 网站在我们的Intranet 上运行了几个星期。我刚刚从我的 application_error emailer 方法收到一封电子邮件,其中包含未处理的异常。
在这里(我已经清理了一些路径以使其更好地显示)
异常:对象引用未设置为对象的实例。堆栈跟踪:在 System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add) at System.Collections.Generic.Dictionary`2.Add(TKey key, TValue value) 在 TimesheetDomain.DataMappers.StaffMemberData TimesheetDomain\DataMappers\StaffMemberData.cs:line 362 中的 .ReadStaff(SqlDataReader 阅读器)
在 TimesheetDomain.DataMappers.StaffMemberData.GetStaffMember(String name) 在 TimesheetDomain\DataMappers\StaffMemberData.cs:line 401
在 TimesheetDomain\ServiceLayer\TimesheetManager.cs:line 199 中的 TimesheetDomain.ServiceLayer.TimesheetManager.GetUserFromName(String name)
在 \App_Code\UserVerification.cs: 第 29 行的 UserVerification.GetCurrentUser() 在 \WebTimesheets\WebTimesheets.master.cs: 第 159 行的 WebTimesheets.OnInit(EventArgs e)
在 System.Web.UI.Control.InitRecursive(控制命名容器) 在 System.Web.UI.Control.InitRecursive(控制命名容器) 在 System.Web.UI.Page.ProcessRequestMain(布尔 includeStagesBeforeAsyncPoint,布尔 includeStagesAfterAsyncPoint)
基本上,我的 ReadStaff 方法似乎出错了,该方法读取数据读取器以构建员工对象。这是一段代码:
while (reader != null && reader.Read())
{
StaffMember newMember = null;
string firstName = reader["FirstName"].ToString();
string lastName = reader["LastName"].ToString();
int staffID = (int)reader["StaffID"];
int employSection = (int)reader["EmploySection"];
StaffType employType = (StaffType)employSection;
string emailAddress = reader["EmailInt"].ToString();
int employCode = (int)reader["ibbwid"];
//check if they are an admin staff member
if (IsAdminStaff(employType))
{
newMember = new AdminOfficer(firstName, lastName, employType, staffID, emailAddress, employCode);
}
else
{
//check if they are a supervisor
if (IsASupervisor(staffID))
newMember = new Supervisor(firstName, lastName, employType, staffID, emailAddress, employCode);
else
newMember = new StaffMember(firstName, lastName, employType, staffID, emailAddress, employCode);
}
//add to identity map
if (!_staffMembers.ContainsKey(staffID))
_staffMembers.Add(staffID, newMember); //****THIS IS LINE 362*****
else
_staffMembers[staffID] = newMember;
}
(第 362 行是倒数第 3 行)我正在使用身份图(只是阅读 fowlers 关于模式的书,并认为这是一个好主意 - 可能做错了,很高兴评论)但这并不太相关,因为我稍后使用其他地方的newMember
对象,所以如果我删除那个块,NullReferenceException
就会发生。
我正在努力看看newMember
那里的最后第三行(这是错误的行)到底是如何为空的。
Resharper/VS 没有给我一个可能的警告null
——因为我可以选择 3 个构造函数。
谁能建议我在哪里可以尝试修复此错误?它只发生过一次,自网站上线以来,该方法已被调用了数千次。
谢谢
[编辑] 根据要求,这是工作人员的 IComparer
/// <summary>
/// Comparer for staff members - compares on name
/// </summary>
public class StaffMemberComparer : IComparer
{
public int Compare(object x, object y)
{
//check they are staff members
if (x is StaffMember && y is StaffMember)
{
//do a simple string comparison on names
StaffMember staffX = x as StaffMember;
StaffMember staffY = y as StaffMember;
return String.Compare(staffX.FirstName, staffY.FirstName);
}
throw new Exception("This is for comparing Staff Members");
}
}
它用于 IComparable 实现
/// <summary>
/// IComparable implementaiton
/// </summary>
/// <param name="obj">object to compare to</param>
/// <returns></returns>
public int CompareTo(object obj)
{
StaffMemberComparer comparer = new StaffMemberComparer();
return comparer.Compare(this, obj);
}