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

时间:2010-04-16 21:50:04

标签: c# .net

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

如果你在调试过程中发现它们,当然程序会对违规生物进行攻击,但是如果它在程序出现之后发生,那么祝你好运。

必须有办法。

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

4 个答案:

答案 0 :(得分:19)

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

someObject.GetInstance().DoSomething();

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

如果您在编译的程序集中有调试信息,您将在异常中获得堆栈跟踪中的行号,但这是尽可能接近的。

答案 1 :(得分:10)

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

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

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

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


真实答案是为了防止抛出永远这种异常。这表明某些代码写得不好,无法处理引用为null的情况。

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

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

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

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

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

修改

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

这是关于理解变量可以分配到哪里null以及不能分配变量的地方。如果将类中的私有字段分配给构造函数中的非空值,并且永远不再分配该值,则无需检查该值是否为null;你班级的设计确保它永远不会。

设计良好的对象将限制分配null值的机会,并且在适当的情况下使用保护代码,以便在null值存在时抛出异常。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我认为目前你能得到的最好的是行号

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

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