イントラネット上でasp.netWebサイトを数週間ライブで実行しています。未処理の例外を除いて、application_erroremailerメソッドからメールを受け取りました。
これが(表示を改善するためにいくつかのパスをクリーンアップしました)です。
例外:オブジェクト参照がオブジェクトのインスタンスに設定されていません。スタックトレース: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 TimesheetDomain \ DataMappers \ StaffMemberData.cs:line 362の.ReadStaff(SqlDataReaderリーダー)
TimesheetDomain \ DataMappers \ StaffMemberData.cs:line 401のTimesheetDomain.DataMappers.StaffMemberData.GetStaffMember(String name)で
TimesheetDomain \ ServiceLayer \ TimesheetManager.cs:line199のTimesheetDomain.ServiceLayer.TimesheetManager.GetUserFromName(String name)で
\ App_Code \ UserVerification.cs:line 29のUserVerification.GetCurrentUser()で\ WebTimesheets \ WebTimesheets.master.cs:line159のWebTimesheets.OnInit(EventArgs e)で
System.Web.UI.Control.InitRecursive(ControlnamingContainer)でSystem.Web.UI.Control.InitRecursive(ControlnamingContainer)で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行目は最後の3行目です)私はアイデンティティマップを使用しています(パターンに関するファウラーの本を読んで、それは良い考えだと思いました-間違っていたかもしれません、コメントを喜んでいます)が、後で使用するので、それはあまり関連性がありません他の場所にあるnewMember
オブジェクトなので、そのブロックを削除するNullReferenceException
と発生します。
newMember
そこにある最後の3行目(エラーが発生した行)で、いったいどのようにnullであるかを確認するのに苦労しています。
Resharper / VSは、その可能性があるという警告を表示しませんnull
。これは、私が選択した3つのコンストラクターがあるためです。
このエラーを修正するためにどこを探すことができるかを誰かが提案できますか?これは1回だけ発生し、サイトが公開されてからそのメソッドは何千回も呼び出されています。
ありがとう
[編集]ご要望に応じて、こちらがスタッフ向けの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);
}