这是我编程存在的祸根.部署应用程序后,当出现此错误时,没有任何调试转储告诉您未实例化WHAT对象.我有调用堆栈,这很好,它告诉我对象的大致位置,但有没有办法让.NET告诉我对象的实际名称?
如果你在调试时发现它们,当然程序会在违规的生物上发生攻击,但是如果它在程序出现之后发生,那么祝你好运.
必须要有办法.
我已经探索了在这些实例中返回的异常,并且没有任何帮助.
Guf*_*ffa 19
不,这是不可能的.发生异常是因为引用为null,并且引用没有名称.变量和类/结构成员具有名称,但不确定引用是否存储在其中任何一个中.例如,可以像这样创建引用:
someObject.GetInstance().DoSomething();
Run Code Online (Sandbox Code Playgroud)
如果GetInstance方法返回null,则在尝试使用引用调用时会出现空引用异常DoSomething.引用只是方法的返回值,它不存储在变量中,因此没有任何内容可以从中获取名称.
如果在编译的程序集中有调试信息,则会在异常中获取堆栈跟踪中的行号,但这是尽可能接近的.
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可能存在值时抛出异常.
| 归档时间: |
|
| 查看次数: |
21556 次 |
| 最近记录: |