どのように私は右のコンストラクタの後、ここで、このとNullReferenceExceptionエラーが発生しましたか?

StackOverflow https://stackoverflow.com/questions/1320264

質問

私は今、数週間のカップルのための私達のイントラネット上でライブ実行されているasp.netのウェブサイトを持っていました。私は未処理の例外を除いて、私のApplication_Error Emailerの方法から電子メールを得ました。

ここでは、それは(私はそれがより良い表示にするパスの一部をクリーンアップしました)です。

  

例外:オブジェクト参照がオブジェクトのインスタンスに設定されていません。   スタックトレース:System.Collections.Generic.Dictionary`2.AddでSystem.Collections.Generic.Dictionary`2.Insert(処理鍵キー、TValue値、ブールアドオン)で(処理鍵キー、TValue値)    TimesheetDomain \ DataMappers \ StaffMemberData.csでTimesheetDomain.DataMappers.StaffMemberData.ReadStaff(SqlDataReaderのリーダー)で:ライン362

     

で   TimesheetDomain.DataMappers.StaffMemberData.GetStaffMember(文字列   名)で   TimesheetDomain \ DataMappers \ StaffMemberData.cs:ライン   401

     

で   TimesheetDomain.ServiceLayer.TimesheetManager.GetUserFromName(文字列   名)で   TimesheetDomain \ ServiceLayer \ TimesheetManager.cs:ライン   199

     

UserVerification.GetCurrentUserで()   ライン:\にApp_Code \ UserVerification.csで   WebTimesheets.OnInitの29(EventArgsの   E)に   \ WebTimesheets \ WebTimesheets.master.cs:ライン   159

     

で   System.Web.UI.Control.InitRecursive(コントロール   NamingContainer)で   System.Web.UI.Control.InitRecursive(コントロール   NamingContainer)で   System.Web.UI.Page.ProcessRequestMain(ブール   includeStagesBeforeAsyncPoint、ブール   includeStagesAfterAsyncPoint)

それはスタッフのオブジェクトを構築するためのデータリーダーを読み、私のReadStaff方法でerroringているように基本的にはそれが見えます。ここでは、コードのビットは、次のとおりです。

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に見るのに苦労しています(エラーが発生したラインである)が第三の最後の行にはnullです。

私が選ぶ3つのコンストラクタがありますので、 -

ReSharperの/ VSは私にそれがnullすることができることを警告を与えるものではありません。

私がしようとすると、このエラーを修正するために見ることができる。ここで、

誰もがお勧めすることはできますか?それは一度だけ起こったとサイトにはライブ行ってきましたので、その方法は、何千回も呼ばれてきました。

おかげ

[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);
}
役に立ちましたか?

解決

これは、ほぼ確実にスレッドの問題である - <のhref = "https://stackoverflow.com/questions/1320621/throw-a-nullreferenceexception-while-calling-the-setitem-method-of-a-dictionary見ます「>この質問とその受け入れ答えでます。

辞書インスタンスが挿入操作中に別のスレッドから変更された場合Dictionary<>.Insert()が内部NullReferenceExceptionがスローされます。

他のヒント

.NET 4.0の時点で、あなたはConcurrentDictionaryを使用して、複数のスレッドから同時に同じ辞書を操作に関連付けられたスレッドの問題を回避することができます。

  

これは、一度だけ起こったことです   この方法は、何千人ものと呼ばれてきました   サイト以来の時間がライブを行った。

これを読んだ後、私は.NETは、メモリを使い果たしてしまったことがその可能性、それを締結することができますし、それはそれ以上の辞書のキーを作成できませんでした、それは本当にどこでもあなたのせいではないかもしれません。しかし、はい、私たちはWebアプリケーションのメモリフットプリントを増やすため、セッション/アプリケーション変数であまりにも多くの情報を保存しようとしたエラーのこれらの種類を手に入れました。私たちの番号は辞書やリストなど10,000アイテムを保存するように、本当に高い行ったときしかし、私たちはこのようなエラーを得ています。

のパターンは良いですが、あなたはまた、我々は、我々は似たものを保存するためにメモリを使用して起動する場合は、その後、我々は強力なデータベースを無視している、リレーショナル形式で情報を格納するデータベースを使用することを認識しなければなりません。データベースは、同様にあなたのための値をキャッシュすることができます。

これは愚かに聞こえるかもしれないが、トラフィックがないとき、私たちは真夜中に、24時間ごとに、当社のWindowsサーバの再起動を持っています。それは、このようなエラーを取り除くに私たちを助けました。私たちは、クリアすべてのキャッシュ/ログを取得するために、固定スケジュールで定期的に当社のサーバーを再起動します。

私は明らかに何かを見ることができません。私は、不良データのためのデータベースをチェックするために、いくつかのSQLを実行すると思います。問題は、関連する入力フォームでフリークのバグかもしれません。コードは今まで何事もなく何千回も実行された場合は、少なくともstaffIdを得ることができるので、それが次に起こるとき/場合、私は、問題のコードブロックの周りにいくつかの追加の例外処理/レポーティングをラップと思います。

あなたはこのような何かに多くの時間を燃やすことができます。最も好都合なアプローチは、それが引き起こす混乱のレベルはマイナー/ /許容管理可能であると仮定すると.....ちょうどそれが上記の/制御された条件下で、再び失敗してみましょうすることであってもよい。

私は文句を言わない知っているが、それは特にこのような低い故障率との問題を管理するための最良の方法かもしれ即時の必要性を満たしていることを感謝しています。

他の人が言ったように、

、比較が問題を引き起こしている可能性があります。
比較のための基準のいずれかがNULL値を含むていますか?具体的には、文字列プロパティ?

すなわち。ファーストネームまたは姓またはEMAILID場合はnullであり、それは比較に使用されている場合、比較用の辞書内で使用された場合、物事が失敗する可能性があります。

編集:どのようにスーパーバイザーとStaffMemberとAdminStaffクラスが関係している
? コードでは、StaffMemberに両方のインスタンスをキャストしています。私の推測では、スーパーバイザとStaffMemberクラスは関連していないのをしている場合、それが問題になる可能性があるということです。

EDIT2:辞書インスタンスのscropeは何ですか?それは、アプリケーション・レベル/セッション・レベルで共有されていますか?それは、複数のスレッドがそれから読み取り/書き込みをしようとすることができることは可能ですか?

辞書をシリアライズするとき

私はこの例外を見ているもう一つの方法は、スレッドとは無関係な、です。この場合、それは空だったが、私はまだ非直列化されたインスタンス上の挿入()メソッドではとNullReferenceExceptionを得ています。

私の場合は簡単な変更は、逆シリアル化後に新しいインスタンスを作成することだけでした。私は、シリアル化だけで辞書を壊すかどうかわからないんだけど、またはそれがあれば辞書に定義されている種類ます。

私の場合は種類は、シリアル化サロゲートなしの直列化可能ではなかった(と私は、これらを提供していた)が、辞書にあるかもしれない何かがここで問題がありました。再びしかし、辞書は空だった、これはまだ起こっています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top