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

Jas*_*son 28 .net c#

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

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

必须要有办法.

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

Guf*_*ffa 19

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

someObject.GetInstance().DoSomething();
Run Code Online (Sandbox Code Playgroud)

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

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

  • @Jason:我认为您需要将PDB文件复制到程序位置.PDB文件是调试器用于从已编译代码中的位置映射到源文件中的位置的文件. (5认同)

Pau*_*ner 10

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

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

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

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


真正的答案是为了防止此异常从以往被抛出.这表明某些代码编写得很糟糕,未能处理引用的情况null.

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

if(parameter == null)
    throw new ArgumentNullException("parameter");
Run Code Online (Sandbox Code Playgroud)

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

if(Property == null)
    throw new InvalidOperationException("Property cannot be null.");
Run Code Online (Sandbox Code Playgroud)

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

编辑:

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

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

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