2010-02-23 59 views
1

添加到一个数组时对象引用不设置为一个对象的一个​​实例我有一段代码:我得到一个System.NullReferenceException:试图将值在运行时

编辑:_penParams初始化为下面添加的行。

ProjectionParameters _penParams = new ProjectionParameters(); 

    [Given(@"Rate Rule List $raterule")] 
    public void Rate_Rule_List(Int32 raterule) 
    { 

     _penParams.RateRuleIds.Initialize(); 

     _penParams.RateRuleIds.Add(raterule); 

    } 

它引用定义为整数数组:

 private Collection<Int32> rateRuleIds; 
    /// <summary> 
    /// A collection of rate rule Ids the member has selected. This is only relevant for an AgeServiceOptions Rates Mode. 
    /// </summary> 
    public Collection<Int32> RateRuleIds 
    { 
     get { return rateRuleIds; } 
    } 

两件事情发生:

  1. 的。新增的方法是不提供给我,当我尝试编译,有人在以前的实例中可用,但是由于我从直接使用DLL切换到调用Web服务来执行测试,因此已经消失。
  2. 如果我试图访问数组的任何部分,其任何属性,我得到一个“System.NullReferenceException:对象引用未设置为对象的实例”错误。

任何想法将不胜感激!

顺便说一句:我正在使用NBehave开发一个简单的语法,允许非技术人员指定要测试的最终用户条件。

+0

堆栈跟踪将是有益的... – 2010-02-23 14:57:54

回答

1

对集合的引用为空,通常是初始化集合失败的结果。空引用异常意味着您试图访问不存在的实例上的成员。 (是否有原因,你没有初始化在线声明集合?)

基于其他意见,我怀疑你对初始化感到困惑。您声明您在ProjectionParameters()中初始化了this.rateRuleIds。在您使用rateRuleIds或​​执行任何操作之前,您是否确定要拨打ProjectionParameters()?如果是这样,你确定该集合不是以后被设置为空?

作为故障排除步骤,我建议在ProjectionParameters()处设置断点,this.rateRuleIds = new Collection<int>();,另一个位于RateRuleIds.get属性访问器中。然后我建议运行代码以确保ProjectionParameters在您获得或使用rateRuleIds之前实际执行。如果它被执行,请继续通过,验证this.rateRuleIds的值是您期望的每一步的值,直到您遇到您的NullReferenceException

+0

我不得不选择一个答案,格雷格斯被证明是最有建设性的,帮助我解决问题。问题是双重的: 1. RateRuleIds是只读的,开发人员已将其更改为允许我访问。 2.我必须通过在我的代码开始处添加以下行来正确初始化RateRuleIds数组:penParams.RateRuleIds = new Int32 [10]。大小并不重要,因为可以提供有限数量的速率ID。 感谢您的帮助,非常感谢。 Ivor – Ivor 2010-02-23 17:04:46

+0

@Ivor:拥有RateRuleIds属性的开发人员通常应该负责确保在其公开界面上进行正确初始化。很高兴我能帮上忙。 :) – 2010-02-23 19:04:04

0

你有没有初始化您的收藏像这样:

rateRuleIds = new Collection<Int32>(); 
0

看起来像

private Collection<Int32> rateRuleIds; 

将不会被初始化到任何地方new Collection<Int32>() ...

编辑:

所以你说你已经初始化了这个集合。那么_penParams实际上是否已初始化?

为什么你不能调试代码,看看问题是什么?

在集合被初始化的代码上放置一个断点并确保它被调用。在翻倒的线上放置一个断点并检查变量以查看哪一个为空。

+0

公共ProjectionParameters() \t \t { \t \t \t this.rateRuleIds =新的集合(); \t \t} 它在更大的参数集合中被初始化。 – Ivor 2010-02-23 14:15:17

1

当你真的初始化数组:

rateRuleIds = new Collection<Int32>(); 

编辑:

既然你说你其实初始化变量,那么我会信任你。但是,我不太确定这条线是什么:

_penParams.RateRuleIds.Initialize(); 

Initialize()某种扩展方法?因为它不是Collection类的一部分。

4
private Collection<Int32> rateRuleIds; 

需要initializerateRuleIds,因为它是唯一declared呢。

Collection<Int32> rateRuleIds = new Collection<int>(); 

对象的宣言告诉编译器这个对象存在的,这是 规范,并准备 处理。 初始化, 另一方面为 分配内存对象。

+1

我认为Ivor已经提到他实际上在其他地方初始化变量...... – Josh 2010-02-23 14:24:04

+1

如果粘贴的代码是初始化代码,它不是(事实上不能)初始化集合,因为在' RateRuleIds'属性。 – 2010-02-23 14:37:13

+0

与“图片或未发生”规则等效的SO是“粘贴代码或您没有写入”。 – xcud 2010-02-23 14:54:18