Concernant ce message d'exception non gérée .NET:
La référence d'objet n'est pas définie à une instance d'un objet.
Pourquoi .NET ne montre-t-il pas quel objet est null
?
Je sais que je peux rechercher null
et résoudre l'erreur. Cependant, pourquoi .NET n'aide-t-il pas à indiquer quel objet a une référence null et quelle expression a déclenché le NullReferenceException
?
Réponses:
(Pour plus d'informations sur le nouvel assistant d'exception dans Visual Studio 2017, consultez la fin de cette réponse)
Considérez ce code:
Cela lèvera un
NullReferenceException
dans la deuxième ligne et vous voulez savoir pourquoi .NET ne vous dit pass
qu'il était nul lorsque l'exception a été levée.Pour comprendre pourquoi vous n'obtenez pas cette information, vous devez vous rappeler que ce n'est pas la source C # qui s'exécute mais plutôt IL:
C'est l'
callvirt
opcode qui lance leNullReferenceException
et il le fait lorsque le premier argument de la pile d'évaluation est une référence nulle (celle qui a été chargée avecldloc.0
).Si .NET doit être capable de dire qu'il
s
s'agit d'une référence nulle, il doit d'une certaine manière suivre que le premier argument de la pile d'évaluation est issu de la formes
. Dans ce cas, il est facile pour nous de voir que c'ests
nul, mais que se passe-t-il si la valeur est une valeur de retour d'un autre appel de fonction et n'est stockée dans aucune variable? Quoi qu'il en soit, ce type d'informations n'est pas ce que vous voulez garder une trace dans une machine virtuelle comme la machine virtuelle .NET.Pour éviter ce problème, je vous suggère d'effectuer une vérification d'argument null dans tous les appels de méthode publique (à moins bien sûr que vous n'autorisiez la référence null):
Si null est passé à la méthode, vous obtenez une exception qui décrit précisément le problème (c'est-à-
s
dire null).Quatre ans plus tard, Visual Studio 2017 dispose désormais d'un nouvel assistant d'exception qui essaiera de dire ce qui est nul quand a
NullReferenceException
est levé. Il est même capable de vous donner les informations requises lorsque c'est la valeur de retour d'une méthode qui est nulle:Notez que cela ne fonctionne que dans une version DEBUG.
la source
null
.null
- notez que l'OP ne prétend pas qu'il ou elle veut savoir que pour les versions de version, les versions de débogage peuvent également être suffisantes.null
) avec la ligne et la colonne du fichier source qui ont renvoyé cette référence d'objet.Comment voulez-vous que le message d'erreur dans le cas suivant ressemble?
Aucun nom de variable à signaler ici!
la source
Object reference obtained from AnyObject.GetANullObject() not set to an instance of an object.
le message d'erreur.Eh bien, c'est aux ingénieurs de Microsoft de répondre. Mais vous pouvez évidemment utiliser un débogueur et ajouter une montre pour savoir lequel de ceux-ci a un problème.
Cependant, 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 du tout été créé.but why .NET don't tell us which object is null?
Parce qu'il ne sait pas quel objet est nul. L'objet n'existe tout simplement pas!Il en va de même lorsque je dis, C # est compilé en code .NET IL. Le code .NET IL ne connaît pas les noms ou expressions. Il ne connaît que les références et 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 d'omelette si vous n'avez pas d'oeuf en premier lieu.
la source
Pas sûr, mais c'est peut-être parce que .Net ne sait pas s'il s'agit d'une classe prédéfinie ou définie par l'utilisateur. S'il est prédéfini, il peut être nul (comme une chaîne qui occupe 2 octets), mais s'il est défini par l'utilisateur, nous devons en créer une instance pour qu'il sache que cet objet occupera autant de mémoire. Donc, il jette une erreur au moment de l'exécution.
la source
Bonne question. La boîte de message est tout simplement inutile. Même si elle est enfouie à un kilomètre de la définition des références, une classe ou un assemblage ou un fichier ou d'autres informations seraient mieux que ce qu'ils fournissent actuellement (lire: mieux que rien).
Votre meilleure option est de l'exécuter dans le débogueur avec les informations de débogage, et votre IDE se cassera à la ligne incriminée (démontrant plutôt clairement que des informations utiles sont en fait disponibles).
la source