【发布时间】:2010-11-22 03:49:14
【问题描述】:
我有一个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.ReadStaff(SqlDataReader reader) 在 TimesheetDomain\DataMappers\StaffMemberData.cs:line 362
在 TimesheetDomain.DataMappers.StaffMemberData.GetStaffMember(字符串 名称)在 TimesheetDomain\DataMappers\StaffMemberData.cs:line 401
在 TimesheetDomain.ServiceLayer.TimesheetManager.GetUserFromName(字符串 名称)在 TimesheetDomain\ServiceLayer\TimesheetManager.cs:line 199
在 UserVerification.GetCurrentUser() 在 \App_Code\UserVerification.cs:line 29 在 WebTimesheets.OnInit(EventArgs e) 在 \WebTimesheets\WebTimesheets.master.cs:line 159
在 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 行是倒数第三行)
我正在使用身份图(只是阅读 fowlers 关于模式的书,并认为这是一个好主意 - 可能做错了,对 cmets 感到高兴)但这并不太相关,因为稍后我在其他地方使用 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);
}
【问题讨论】:
-
TimesheetDomain\DataMappers\StaffMemberData.cs:line 362 是哪一行?
-
这与实际问题无关,但您可以将整个
if (!_staffMembers.ContainsKey(staffID)) _staffMembers.Add(staffID, newMember); else _staffMembers[staffID] = newMember;替换为_staffMembers[staffID] = newMember;。如果它不存在,它将添加密钥。 -
对不起(没有说得很清楚)362 行是我代码块中的第三行,它的 _staffMembers.Add(staffID, newMember);谢谢 mehrdad,我会记住的,我以为我这样做是有原因的,但现在不记得了,所以我会试试你的版本
标签: c# asp.net nullreferenceexception