对象引用未设置为对象的实例 – 如何在exception中查找违规对象名称?

这是我编程存在的祸根。 部署应用程序后,当出现此错误时,没有任何调试转储告诉您未实例化WHAT对象。 我有调用堆栈,这很好,它告诉我对象的大致位置,但有没有办法让.NET告诉我对象的实际名称?

如果你在调试时捕获它们,当然程序会在违规生物上发生攻击,但是如果它在程序出现之后发生,那么祝你好运。

必须要有办法。

我已经探索了在这些实例中返回的exception,并没有任何帮助。

不,这是不可能的。 发生exception是因为引用为null,并且引用没有名称。 变量和类/结构成员具有名称,但不确定引用是否存储在其中任何一个中。 例如,可以像这样创建引用:

someObject.GetInstance().DoSomething(); 

如果GetInstance方法返回null,则在尝试使用该引用调用DoSomething时会出现空引用exception。 引用只是方法的返回值,它不存储在变量中,因此没有任何内容可以从中获取名称。

如果在编译的程序集中有调试信息,则会在exception中获取堆栈跟踪中的行号,但这是尽可能接近的。

NullReferenceException是应用程序中所有exception中最邪恶的。 这意味着在访问之前未检查null null引用的null值。

这是邪恶的,因为运行时无法确定您希望在引用中找到什么,因此它无法告诉您精确地无法取消引用的内容。

堆栈跟踪是此exception中唯一的朋友,它至少可以识别引发exception的方法。 如果您的代码足够整洁,它应该识别少量代码以进行检查。

此外,如果您正在使用调试版本运行并具有程序集的调试信息,您甚至可以在堆栈跟踪中获取源行号,这样您就可以准确地知道该方法失败的行。


真正的答案是防止这种exception被抛出。 这表明某些代码写得不好,无法处理引用为null

如果你有一个方法被调用,你需要用某个引用类型参数做某事需要在某个时候被引用,检查null并抛出ArgumentNullException ,指示ArgumentNullException的名称:

 if(parameter == null) throw new ArgumentNullException("parameter"); 

如果要在类中执行操作并且可以将settable属性设置为null ,请在取消引用之前进行检查并抛出指示问题的InvalidOperationException

 if(Property == null) throw new InvalidOperationException("Property cannot be null."); 

您还应该确保所有可以返回引用类型的方法都保证返回一个值。 对于那些不是的,对null进行类似的检查并适当地处理大小写。

编辑:

为了澄清,我建议您在取消引用之前对每个引用类型变量执行检查。 那将是疯狂的。

它是关于理解变量可以赋值为null以及不能赋值的位置。 如果将类中的私有字段分配给构造函数中的非空值,并且永远不再分配该值,则不需要检查该值是否为null ; 你class级的设计确保它永远不可能。

精心设计的对象将限制分配null值的机会,并且在适当的情况下将使用保护代码在可以存在null值时抛出exception。

这是您真正需要附加到应用程序并逐步执行违规代码的一般区域以确定空引用的来源的实例之一。

我认为目前最好的是行号。

StackTrace: at test_003.Form1.button1_Click(Object sender, EventArgs e) in C:\Documents and Settings\...\Projects\test_003\test_003\Form1.cs:line 52

如果他们将来就这个问题做些什么,那就太好了。