有没有办法找出导致NullReferenceException
的具体对象?我已经阅读了有关troubleshooting NullReferenceException
s的页面,它讨论了在调试器中检查变量并查看异常消息。
如果在生产代码中抛出异常,那么您无法运行调试器来检查变量,该怎么办?异常消息显示堆栈跟踪,因此您可以看到抛出异常的方法,但它没有说明哪个特定对象是null
。
我希望能够将null
对象的名称添加到错误消息中,这样当我查看用户的报告时,我遇到了NullReferenceException
,我可以很容易地看到null
是什么对象并修复它。有谁知道这样做的方法?
我也发现this question问同样的事情,但它是从2011年开始,我不知道从那以后有什么变化。
编辑:The question,这被标记为重复确实是重复,但也很老(2008年)。从那时起有什么变化吗?
编辑2:我在谷歌搜索这个问题时找到了this。 Visual Studio可以告诉你什么扔了NullReferenceException
;有没有办法利用它来将其添加到日志文件?
给出堆栈跟踪应该相对容易找出,但更好的方法是在代码中包含“验证”或参数和/或空检查,并在尝试访问变量的成员之前自己显式抛出ArgumentNullException
。可能尚未初始化。然后,您可以提供未初始化对象的名称:
if (obj == null)
throw new ArgumentNullException(nameof(obj));
在构造函数和方法中对参数执行这些检查是常见的做法,例如:
public void SomeMethod(SomeType someArgument)
{
if (someArgument == null)
throw new ArgumentNullException(nameof(someArgument));
//you will never get there if someArgument is null...
var someThing = someArgument.SomeMember;
if (someThing == null)
throw new ArgumentException("SomeMember cannot be null.", nameof(someArgument));
...
}