2012-05-18 55 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