gpt4 book ai didi

c# - 我是怎么在构造函数之后在这里得到这个 NullReferenceException 错误的?

转载 作者:IT王子 更新时间:2023-10-29 03:51:25 26 4
gpt4 key购买 nike

我已经有几个星期在我们的 Intranet 上实时运行了一个 asp.net 网站。我刚刚从我的 application_error 电子邮件发送器方法收到一封电子邮件,其中有一个未处理的异常。

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

Exception : Object reference not set to an instance of an object. Stack Trace : at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add) at System.Collections.Generic.Dictionary`2.Add(TKey key, TValue value) at TimesheetDomain.DataMappers.StaffMemberData.ReadStaff(SqlDataReader reader) in TimesheetDomain\DataMappers\StaffMemberData.cs:line 362

at TimesheetDomain.DataMappers.StaffMemberData.GetStaffMember(String name) in TimesheetDomain\DataMappers\StaffMemberData.cs:line 401

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

at UserVerification.GetCurrentUser() in \App_Code\UserVerification.cs:line 29 at WebTimesheets.OnInit(EventArgs e) in \WebTimesheets\WebTimesheets.master.cs:line 159

at System.Web.UI.Control.InitRecursive(Control namingContainer) at System.Web.UI.Control.InitRecursive(Control namingContainer) at 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 行是倒数第三行)我正在使用恒等映射(刚刚阅读了关于模式的福勒斯书籍并认为这是一个好主意 - 可能做错了,很高兴发表评论)但这并不过分相关,因为稍后我使用 newMember 其他地方的对象,所以如果我删除该 block ,将发生 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");
}
}

并且在 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);
}

最佳答案

这几乎可以肯定是线程问题 - 请参阅 this question and its accepted answer .

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

关于c# - 我是怎么在构造函数之后在这里得到这个 NullReferenceException 错误的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1320264/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com