2012-05-18 53 views
1

我正在使用instrument2Orders字典。我使用instrument作爲關鍵字,ordersOfGlass作爲值添加到它。我所有的實例或不是null什麼證明下面的輸出,但我仍然收到System.NullReferenceException這怎麼可能?NullReferenceException添加到字典時

private Dictionary<Instrument, List<Order>> instrument2Orders = new Dictionary<Instrument, List<Order>>(); 

......... 
     public void InitialRegisterOrder(Order order) 
      ..... 
     if (instrument2Orders.ContainsKey(instrument)) 
     { 
      ordersOfGlass = instrument2Orders[instrument]; 
     } 
     else 
     { 
      ordersOfGlass = new List<Order>(); 
      try 
      { 
       instrument2Orders.Add(instrument, ordersOfGlass); 
      } catch(Exception e) 
      { 
       Console.WriteLine(e.Message); 
       Console.WriteLine(e.StackTrace); 
       Console.WriteLine(e.ToString()); 
       Console.WriteLine(e.InnerException); 
       Console.WriteLine("XYZ! instrument = " + instrument + " ordersOfGlass = " + ordersOfGlass + " instrument2Orders = " + instrument2Orders); 
      } 
     } 

輸出:

System.NullReferenceException: ‘бл«Є  ­  ®ЎкҐЄв ­Ґ гЄ §лў Ґв ­  нЄ§Ґ¬Ї«па ®ЎкҐЄв . 
    ў System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add) 
    ў MBClient.Market.InitialRegisterOrder(Order order) ў C:\Oleg\projects\MBClient\MBClient\Market.cs:бва®Є  233 

XYZ! instrument = ClassCode: EQNL Ticker: GAZP. ordersOfGlass = System.Collections.Generic.List`1[Commons.Order] instrument2Orders = System.Collections.Generic.Dictionary`2[Commons.Instrument,System.Collections.Generic.List`1[Commons.Order]] 

儀器類:

class Instrument 
{ 
    //public Instrument(int id, string classCode, string ticker) 
    //{ 
    // this.Ticker = ticker; 
    // this.ClassCode = classCode; 
    //} 

    public string ClassCode { get; set; } 
    public string Ticker { get; set; } 
    public override string ToString() 
    { 
     return "ClassCode: " + ClassCode + " Ticker: " + Ticker + '.'; 
    } 

    public override bool Equals(object obj) 
    { 
     if (obj == null) 
     { 
      return false; 
     } 
     Instrument instrument = obj as Instrument; 
     if (instrument == null) 
     { 
      return false; 
     } 
     return (ClassCode.Equals(instrument.ClassCode)) && (Ticker.Equals(instrument.Ticker)); 
    } 

    public override int GetHashCode() 
    { 
     int hash = 13; 
     hash = (hash * 7) + ClassCode.GetHashCode(); 
     hash = (hash * 7) + Ticker.GetHashCode(); 
     return hash; 
    } 
} 
+1

上面哪段代碼引發異常? – Steve

+1

了在您的情況下,有多個線程是指接入字典實例 – V4Vendetta

+1

您可以翻譯「「бл«Є®ЎкҐЄвҐгЄ§лўҐвнЄ§Ґ¬Ї«п஡ꥪв」英語?谷歌翻譯努力想出有用的東西。 – joocer

回答

0

第一直覺:儀器爲空。

這個變量來自哪裏?這不是一個參數,它是一個領域?

+3

沒有,null不是一個字典有效的密鑰;看到http://msdn.microsoft.com/en-us/library/k7z0zy8k.aspx - 然而,Dictionary.Add()將引發ArgumentNullException如果是空,和OP的例外是的NullReferenceException –

+0

@MatthewWatson你是絕對正確的,我想這可能是堂妹一些線程問題,也許一些其他線程正在修改它 – V4Vendetta

0

任何機會,請問您儀器類重寫GetHashCode()?

如果確實如此,如果它取消引用一個空的裁判,你就會得到這樣的錯誤(雖然堆棧跟蹤似乎預示着不同的事情是怎麼回事...)

無論如何,這一計劃將給你做一個NullReferenceException當你做dict.Add()時,即使key和value都是非null:

using System; 
using System.Collections.Generic; 

namespace Demo 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Test test = new Test(); 
      var dict = new Dictionary<Test, Test>(); 
      dict.Add(test, test); 
     } 
    } 

    public class Test 
    { 
     public string Value 
     { 
      get; 
      set; 
     } 

     public override int GetHashCode() 
     { 
      return Value.GetHashCode(); 
     } 
    } 
} 
+0

接着說:Instrument'類的話題 – javapowered

+0

好吧,你可以提供顯示問題的一個完整的編譯例子嗎? –

+0

我使'instrument2Orders'訪問線程安全,並解決了這個問題 – javapowered