2010-02-23 11 views
1

J'ai un morceau de code:Je reçois un System.NullReferenceException: référence d'objet non définie à une instance d'un objet lorsque vous essayez d'ajouter une valeur à un tableau à l'exécution

EDIT: Les _penParams sont initialisés comme la ligne ajoutée ci-dessous.

ProjectionParameters _penParams = new ProjectionParameters(); 

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

     _penParams.RateRuleIds.Initialize(); 

     _penParams.RateRuleIds.Add(raterule); 

    } 

Il fait référence à un tableau entier défini comme:

 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; } 
    } 

Deux choses se sont passées:

  1. La méthode .Add est pas disponible pour moi quand je tente de compiler, il a été disponible dans une instance précédente, mais a disparu depuis que je suis passé directement de la DLL à l'appel d'un service Web pour effectuer mes tests.
  2. Si j'essaie d'accéder à n'importe quelle partie de la matrice, l'une de ses propriétés, j'obtiens une erreur "System.NullReferenceException: Référence d'objet non définie sur une instance d'un objet".

Toutes les pensées seraient grandement appréciées! BTW: J'utilise NBehave pour développer une syntaxe simple permettant aux personnes non technophiles de spécifier les conditions de l'utilisateur final à tester.

+0

Stacktrace serait utile ... –

Répondre

1

La référence à votre collection est null, généralement en raison d'un échec d'initialisation de la collection. L'exception de référence nulle signifie que vous essayez d'accéder à un membre sur une instance qui n'existe pas. (Y a-t-il une raison pour laquelle vous n'initialisez pas la collection en ligne là où vous la déclarez?)

D'après d'autres commentaires, je suspecte que vous soyez confus au sujet de l'initialisation. Vous déclarez que vous initialisez this.rateRuleIds dans ProjectionParameters(). Êtes-vous certain que ProjectionParameters() est appelé avant que vous ne fassiez quelque chose avec rateRuleIds ou RateRuleIds? Si oui, êtes-vous certain que la collection ne sera pas plus tard remise à zéro?

Je propose, comme une étape de dépannage, la fixation d'un point d'arrêt dans ProjectionParameters() à la ligne que vous mentionnez, this.rateRuleIds = new Collection<int>();, et une sur la propriété accesseur RateRuleIds.get. Ensuite, je suggère d'exécuter le code pour s'assurer que ProjectionParameters est réellement exécuté avant que vous obtenez ou utilisez rateRuleIds. Si elle est exécutée, continuez pas à pas, en vérifiant que la valeur de this.rateRuleIds est ce que vous attendez qu'il soit à chaque étape jusqu'à ce que vous rencontriez votre NullReferenceException.

+0

J'ai dû choisir une réponse et Gregs s'est montré très constructif en m'aidant à reconnaître le problème. Le problème était double: 1. Le RateRuleIds était en lecture seule, et le développeur l'a depuis changé pour me permettre l'accès. 2. J'ai dû initialiser le tableau RateRuleIds correctement en ajoutant cette ligne au début de mon code: penParams.RateRuleIds = new Int32 [10]. La taille n'a pas d'importance car il existe un nombre fini d'identifiants de débit pouvant être fournis. Merci pour votre aide, il est très apprécié. Ivor – Ivor

+0

@Ivor: Pour ce que ça vaut, le développeur qui possède la propriété RateRuleIds devrait généralement être la personne responsable de s'assurer qu'il est correctement initialisé avant d'être exposé sur leur interface publique. Heureux d'avoir pu aider. :) –

0

Avez-vous jamais votre collection initialize comme ceci:

rateRuleIds = new Collection<Int32>(); 
0

ressemble

private Collection<Int32> rateRuleIds; 

n'est pas initialisées à un new Collection<Int32>() partout ...

EDIT:

si vous dites que vous avez initialisé la collection. Donc _penParams est-il réellement initialisé? Pourquoi ne pouvez-vous pas déboguer le code et voir quel est le problème?

Placez un point d'arrêt sur le code où la collection est initialisée et assurez-vous qu'elle est appelée. Mettez un point d'arrêt sur la ligne qui tombe et inspectez la variable pour voir laquelle est nulle.

+0

ProjectionParameters public() \t \t { \t \t \t this.rateRuleIds = new Collection (); \t \t} Son initialisé dans la plus grande collection de paramètres. – Ivor

1

Lorsque vous initialisez réellement votre tableau:

rateRuleIds = new Collection<Int32>(); 

EDIT:

Puisque vous avez dit que vous êtes en fait l'initialisation de la variable, alors je vais devoir vous faire confiance. Cependant, je ne suis pas vraiment sûr de ce que cette ligne est:

_penParams.RateRuleIds.Initialize(); 

Est-Initialize() une sorte de méthode d'extension? Parce qu'il ne fait pas partie de la classe Collection.

4
private Collection<Int32> rateRuleIds; 

vous devez initializerateRuleIds car il est seulement declared encore.

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

Déclaration d'un objet dit compilateur cet objet existe, c'est la spécification et préparez-vous à gérer. Initialisation, sur le d'autre part alloue la mémoire pour l'objet.

+1

Je pense qu'Ivor a déjà mentionné qu'il est en train d'initialiser la variable ailleurs ... – Josh

+1

Si le code collé est le code d'initialisation, il n'est pas (et en fait, ne peut pas) initialiser la collection car il n'y a pas de setter sur ' Propriété RateRuleIds'. –

+0

Le SO équivalent à la règle "pic ou did not happen" est "coller le code ou vous ne l'avez pas écrit". – xcud