我是如何在构造函数之后立即得到此NullReferenceException错误的?

Rod*_*257 53 c# asp.net nullreferenceexception

我已经在我们的内联网上运行了几个星期的asp.net网站.我收到了来自我的application_error电子邮件发送方法的电子邮件,其中包含未处理的异常.

这是(我已经清理了一些路径以使其更好地显示)

例外:对象引用未设置为对象的实例.堆栈跟踪:位于System.Collections.Generic.Dictionary`2.Insert(TKey键,TValue值,布尔加法)的System.Collections.Generic.Dictionary`2.Add(TKey键,TValue值)位于TimesheetDomain.DataMappers.StaffMemberData TimesheetDomain\DataMappers\StaffMemberData.cs中的.ReadStaff(SqlDataReader reader):第362行

在TimesheetDomain\DataMappers\StaffMemberData.cs中的TimesheetDomain.DataMappers.StaffMemberData.GetStaffMember(String name):第401行

在TimesheetDomain\ServiceLayer\TimesheetManager.cs中的TimesheetDomain.ServiceLayer.TimesheetManager.GetUserFromName(String name):第199行

位于\ App_Code\UserVerification.cs中的UserVerification.GetCurrentUser():位于\ WebTimesheets\WebTimesheets.master.cs中的WebTimesheets.OnInit(EventArgs e)第29行:第159行

System.Web.UI.Page.ProcessRequestMain上的System.Web.UI.Control.InitRecursive(Control namingContainer)中的System.Web.UI.Control.InitRecursive(Control namingContainer)(Boolean includeStagesBeforeAsyncPoint,Boolean 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;
}
Run Code Online (Sandbox Code Playgroud)

(第362行是第3行最后一行)我正在使用身份地图(只是阅读有关模式的fowlers书,并认为这是一个好主意 - 可能做错了,对评论感到高兴)但是这并不是我以后使用的过度相关newMember其他地方的对象,所以如果我删除该块NullReferenceException将发生.

我很难看到地球newMember上的第3个最后一行是怎么回事(这是错误的行).

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

它在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);
}
Run Code Online (Sandbox Code Playgroud)

McK*_*eG1 121

这几乎肯定是一个线程问题 - 看到这个问题及其接受的答案.

Dictionary<>.Insert()NullReferenceException如果在插入操作期间从另一个线程修改了字典实例,则将在内部抛出.

  • 这是完全不明显的,特别是如果您仅从外部看到IDictionary ... (2认同)

Bil*_*oto 18

从.NET 4.0开始,您可以使用ConcurrentDictionary并避免与同时从多个线程操作相同字典相关联的线程问题.