У меня был веб-сайт asp.net, который работает в нашей интрасети в течение нескольких недель. Я просто получил электронное письмо от моего метода application_error emailer с необработанным исключением.
Здесь (ive очистил некоторые из путей, чтобы сделать его лучше отображаемым)
Исключение: ссылка на объект не установлена в экземпляр объекта. Трассировка стека: в System.Collections.Generic.Dictionary
2.Insert(TKey key, TValue value, Boolean add) at System.Collections.Generic.Dictionary
2.Add(ключ TKey, значение TValue) в TimesheetDomain.DataMappers.StaffMemberData.ReadStaff(SqlDataReader reader) в TimesheetDomain\DataMappers\StaffMemberData.cs: строка 362в TimesheetDomain.DataMappers.StaffMemberData.GetStaffMember(String имя) в TimesheetDomain\DataMappers\StaffMemberData.cs: линия 401
в TimesheetDomain.ServiceLayer.TimesheetManager.GetUserFromName(String имя) в TimesheetDomain\ServiceLayer\TimesheetManager.cs: линия 199
в UserVerification.GetCurrentUser() в \App_Code\UserVerification.cs: строка 29 в WebTimesheets.OnInit(EventArgs e) в \ WebTimesheets\WebTimesheets.master.cs: линия 159
в System.Web.UI.Control.InitRecursive(Control namingContainer) в System.Web.UI.Control.InitRecursive(Control 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 - третья последняя строка) Я использую идентификационную карту (просто прочитайте книгу фаутеров по шаблонам и подумал, что это хорошая идея, возможно, сделали это неправильно, доволен комментариями), но это не слишком важно, поскольку позже я использую объект newMember в другом месте, поэтому, если я удалю который блокирует нулевое значение, произойдет.
Я изо всех сил пытаюсь понять, как на земле newMember является нулевым в третьей последней строке (которая является ошибкой строки)
Resharper/VS не дает мне предупреждения, что он может быть нулевым, потому что theres 3 конструктора, которые я выбираю.
Может ли кто-нибудь предложить, где я могу попытаться исправить эту ошибку? Это произошло только один раз, и этот метод был назван тысячами раз с момента выхода сайта.
Спасибо
[EDIT] Как запрошено, здесь 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);
}