Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我是如何在构造函数之后得到这个NullReferenceException错误的?_C#_Asp.net_Nullreferenceexception - Fatal编程技术网

C# 我是如何在构造函数之后得到这个NullReferenceException错误的?

C# 我是如何在构造函数之后得到这个NullReferenceException错误的?,c#,asp.net,nullreferenceexception,C#,Asp.net,Nullreferenceexception,我已经有一个asp.net网站在我们的内部网上实时运行了几个星期了。我刚收到一封来自我的应用程序\u error emailer方法的电子邮件,其中有一个未处理的异常 在这里(我已经清理了一些路径,以便更好地显示) 异常:对象引用未设置为对象的实例。 堆栈跟踪:在System.Collections.Generic.Dictionary`2.在System.Collections.Generic.Dictionary`2.添加(TKey键,TValue值,布尔添加)在System.Collect

我已经有一个asp.net网站在我们的内部网上实时运行了几个星期了。我刚收到一封来自我的应用程序\u error emailer方法的电子邮件,其中有一个未处理的异常

在这里(我已经清理了一些路径,以便更好地显示)

异常:对象引用未设置为对象的实例。 堆栈跟踪:在System.Collections.Generic.Dictionary`2.在System.Collections.Generic.Dictionary`2.添加(TKey键,TValue值,布尔添加)在System.Collections.Generic.Dictionary`2.添加(TKey键,TValue值) 在TimesheetDomain\DataMappers\StaffMemberData.cs中的TimesheetDomain.DataMappers.StaffMemberData.ReadStaff(SqlDataReader reader)处:第362行

在 TimesheetDomain.DataMappers.StaffMemberData.GetStaffMember(字符串 (姓名)在 TimesheetDomain\DataMappers\StaffMemberData.cs:line 401

在 TimesheetDomain.ServiceLayer.TimesheetManager.GetUserFromName(字符串 (姓名)在 TimesheetDomain\ServiceLayer\TimesheetManager.cs:line 199

在UserVerification.GetCurrentUser()处 in\App\u Code\UserVerification.cs:line 29在WebTimesheets.OnInit(EventArgs e) 在 \WebTimesheets\WebTimesheets.master.cs:line 159

在 System.Web.UI.Control.InitRecursive(控件 namingContainer)在 System.Web.UI.Control.InitRecursive(控件 namingContainer)在 System.Web.UI.Page.ProcessRequestMain(布尔值 includeStagesBeforeAsyncPoint,布尔值 includeStagesAfterAsyncPoint)

基本上,它看起来像是在我的ReadStaff方法中出错,该方法读取数据读取器来构建staff成员对象。下面是一段代码:

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");
    }
}
//
///职员比较器-根据姓名进行比较
/// 
公共类StaffMemberComparer:IComparer
{
公共整数比较(对象x、对象y)
{
//检查他们是否是工作人员
如果(x是StaffMember&&y是StaffMember)
{
//对名称进行简单的字符串比较
StaffMember staffX=x作为StaffMember;
StaffMember staffY=y作为StaffMember;
返回String.Compare(staffX.FirstName,staffY.FirstName);
}
抛出新的异常(“这是用来比较工作人员的”);
}
}
它被用于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);
}
//
///可比较实现
/// 
///对象进行比较
/// 
公共整数比较(对象对象对象)
{
StaffMemberComparer comparer=新的StaffMemberComparer();
返回comparer.Compare(this,obj);
}

正如其他人所说,这种比较可能导致问题。
是否有任何比较标准包含空值?具体来说,字符串属性是什么

i、 e.如果firstname、lastname或emailId为null,并且用于比较,则在字典中用于比较时可能会失败

编辑:主管与StaffMember和AdminStaff类的关系如何?
在代码中,您正在将这两个实例强制转换为StaffMember。我的猜测是,如果主管和StaffMember类不相关,则可能会出现问题


EDIT2:字典实例的搜索是什么?它是否在应用程序级/会话级共享?是否可能有多个线程尝试从中读取/写入数据?

我看不到任何明显的内容。我会运行一些SQL来检查数据库中是否有任何错误数据。问题可能是相关输入表单中的异常错误。如果到目前为止,代码已经运行了数千次而没有发生任何事件,那么我会在有问题的代码块周围包装一些额外的异常处理/报告,这样您至少可以在下次发生时得到一个标记

你可以在这样的事情上浪费很多时间。最便捷的方法可能只是让它在上述/受控条件下再次失败。。。。。假设其造成的中断程度可接受/可管理/轻微

我理解这不能满足立即了解的需要,但这可能是处理问题的最佳方法,尤其是在故障率如此低的情况下

这只发生过一次 方法已被调用数千次 自该网站上线以来的时间

读完这篇文章后,我可以得出结论,可能是.NET耗尽了内存,无法创建更多的字典键,这可能不是你的错。但是,是的,当我们试图在会话/应用程序变量中存储太多信息,从而增加Web应用程序的内存占用时,我们确实遇到了此类错误。但当我们的数字真的很高时,比如在字典或列表中存储10000项,我们就出现了这样的错误

这种模式很好,但您还必须认识到,我们使用数据库以关系格式存储信息,如果我们开始使用内存存储类似的内容,那么我们就忽略了强大的数据库。数据库也可以为您缓存值

这听起来可能很傻,但我们每24小时就要重启一次windows服务器,在午夜没有流量的时候重启。这确实帮助我们摆脱了这些错误。我们定期按固定的时间表重新启动服务器,以获得更好的性能