首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >我是如何在构造函数后面得到这个NullReferenceException错误的?

我是如何在构造函数后面得到这个NullReferenceException错误的?
EN

Stack Overflow用户
提问于 2009-08-24 02:41:09
回答 6查看 29.9K关注 0票数 61

我有一个asp.net网站已经在我们的内部网上运行了几个星期了。我刚刚收到一封来自我的application_error电子邮件方法的电子邮件,但有一个未处理的异常。

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

异常:对象引用未设置为对象的实例。堆栈跟踪:在System.Collections.Generic.Dictionary2.Insert(TKey key, TValue value, Boolean add) at System.Collections.Generic.Dictionary2.Add(TKey键处,在TimesheetDomain.DataMappers.StaffMemberData.ReadStaff(SqlDataReader读取器处)在TimesheetDomain\DataMappers\StaffMemberData.cs:line 362中

在TimesheetDomain.DataMappers.StaffMemberData.GetStaffMember(String名称处)在TimesheetDomain\DataMappers\StaffMemberData.cs:line 401中

at TimesheetDomain.ServiceLayer.TimesheetManager.GetUserFromName(String name)在TimesheetDomain\ServiceLayer\TimesheetManager.cs:line 199中

在\App_Code\UserVerification.cs:line 29中的UserVerification.GetCurrentUser()在\WebTimesheets\WebTimesheets.master.cs:line 159中的WebTimesheets.OnInit(EventArgs e)

在System.Web.UI.Control.InitRecursive(控制namingContainer)在System.Web.UI.Control.InitRecursive(控制namingContainer)在System.Web.UI.Page.ProcessRequestMain(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;
}

(第362行是倒数第三行)我使用的是身份映射(只需阅读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);
}
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-02-04 04:41:40

几乎可以肯定这是一个线程问题--参见this question and its accepted answer

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

票数 138
EN

Stack Overflow用户

发布于 2013-01-18 00:44:48

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

票数 22
EN

Stack Overflow用户

发布于 2009-08-24 05:26:38

我看不出有什么明显的东西。我会运行一些SQL来检查数据库中是否有任何坏数据。问题可能是相关输入表单中的一个怪胎错误。如果到目前为止,代码已经运行了数千次而没有发生意外,我会在相关代码块周围包装一些额外的异常处理/报告,这样如果下次发生这种情况,您至少可以获得一个staffId。

你可能会在这样的事情上浪费很多时间。最有利的方法可能是让它在上述/受控制的情况下再次失效……假设它造成的破坏程度是可接受的/可管理的/轻微的。

我知道这不能满足即时的需求,但这可能是管理问题的最好方法,特别是在失败率如此之低的情况下。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1320264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档