104 votes

Référence d’objet n’est pas fixé à une instance d’un objet. Pourquoi n ' t .NET montrer quel objet est « null » ?

En ce qui concerne ce message d’exception non gérée de .NET :

Référence d’objet n’est pas fixé à une instance d’un objet.

Pourquoi .NET ne montre pas quel objet est `` ?

Je sais que je peux vérifier pour et résoudre l’erreur. Cependant, pourquoi n’aide .NET soulignant à quel objet est une référence null et qu’expression a déclenché le ?

169voto

Martin Liversage Points 43712

Considérer ce code:

String s = null;
Console.WriteLine(s.Length);

Cela permettra de jeter un NullReferenceException dans la deuxième ligne et vous voulez savoir pourquoi .NET ne veut pas dire que cela a été s qui est nulle lorsque la levée de l'exception.

Pour comprendre pourquoi vous n'avez pas cette information, vous devriez vous rappeler qu'il n'est pas source en C# qui s'exécute mais plutôt IL:

IL_0001: ldnull 
IL_0002: stloc.0 // s
IL_0003: ldloc.0 // s
IL_0004: callvirt Système.Chaîne de caractères.get_Length
IL_0009: Système d'appel.Console.WriteLine

C'est l' callvirt opcode qui lève l' NullReferenceException et il n'est que lorsque le premier argument sur la pile d'évaluation est référence null (celui qui a été chargé à l'aide d' ldloc.0).

Si .NET devrait être en mesure de dire qu'il a été s qui a été une référence null, il doit, d'une certaine façon que le premier argument sur la pile d'évaluation provient forme s. Dans ce cas, il est facile pour nous de voir que c'est l' s que c'était nul mais que faire si la valeur est une valeur de retour à partir d'un autre appel de fonction et de ne pas stocké dans une variable? De toute façon, ce genre d'information n'est pas ce que vous voulez garder une trace de dans une machine virtuelle comme le .NET de la machine virtuelle.


Pour éviter ce problème, je vous suggère d'effectuer argument null vérification dans tous les appels de méthode (sauf si bien sûr vous permettre la référence nulle):

public void Foo(String s) {
  if (s == null)
    throw new ArgumentNullException("s");
  Console.WriteLine(s.Length);
}

Si la valeur null est passé à la méthode, vous obtenez une exception précisément quel est le problème (qui s est null).

9voto

romar Points 258

Comment voulez-vous que le message d’erreur dans le cas suivant comme look ?

Aucun nom de variable de signaler ici !

1voto

Aniket Points 15250

Eh bien, c'est jusqu'à des ingénieurs de chez Microsoft pour répondre. Mais vous pouvez bien évidemment utiliser un débogueur et ajouter de la regarder pour savoir qui a un problème.

Toutefois, l'exception est - NullReferenceException ce qui signifie que la référence n'existe pas . Vous ne pouvez pas obtenir l'objet qui n'a pas été créé à tous les.

but why .NET don't tell us which object is null? Parce qu'il ne sait pas où l'objet est null. L'objet n'existe tout simplement pas!

Même est le cas quand je dis, C# est compilé .NET code IL. L' .NET code IL ne connaît pas les noms ou expressions. Il ne connaît que des références et de leur emplacement. Ici aussi, vous ne pouvez pas obtenir ce qui n'existe pas. L'expression ou le nom de la variable n'existe pas.

Philosophie: Vous ne pouvez pas faire une omlette si vous n'avez pas un oeuf en premier lieu.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X