首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >"Object reference not set to an object instance“:为什么.NET不能显示更多细节?

"Object reference not set to an object instance“:为什么.NET不能显示更多细节?
EN

Stack Overflow用户
提问于 2010-05-27 10:22:43
回答 4查看 6.1K关注 0票数 15

“未将对象引用设置为对象的实例”

为什么异常不显示object reference字段的name,或者至少显示它的类型?

这可能是.NET中最常见的运行时错误之一,虽然System.Exception有堆栈跟踪,但没有其他有用的细节。

在一年的时间里,我花了几个小时筛选堆栈跟踪(通常是在我没有编写的代码中),希望有来自".pdb“文件的行号,然后在代码中找到该行,即使这样,通常也不清楚该行上的哪个引用是空的。拥有引用字段的名称将非常方便。

如果System.ArgumentNullException实例可以显示方法参数的值名称(“ be null。参数名称:value"),那么System.NullReferenceException实例肯定可以包含null字段(或其包含的集合)的名称。

EN

回答 4

Stack Overflow用户

发布于 2010-05-27 11:03:47

ArgumentNullExceptionNullReferenceException的不同之处在于,ArgumentNullException总是像这样显式抛出:

代码语言:javascript
复制
if (parameter == null)
  throw new ArgumentNullException("parameter");

快速查看一下ILDASM输出,局部变量确实存在于函数的IL中。然而,仍然没有API来以编程方式检索这些名称。我的理解是,这将是相当复杂的,因为你基本上需要构建一个解析树来表示一个带有作用域、变量、语句等的函数。

更复杂的是,抛出NullReferenceException的不只是简单的变量,还有函数调用、属性或表达式的结果。我可以很快变得非常复杂。

想象一下:

代码语言:javascript
复制
internalObject.OtherProperty = myObject.GetOtherObject().ThirdObject.SomeProperty == "value"
 ? myObject.OtherProperty
 : myObject.GetSomethingElse();

这里有多个故障点,构建一个表示实际null的字符串可能很棘手。

票数 6
EN

Stack Overflow用户

发布于 2010-05-27 10:39:02

这里已经介绍了这一点:Detecting what the target object is when NullReferenceException is thrown

这里:Why can't a null-reference exception name the object that has a null reference?

主要原因是运行时不知道何时会遇到NRE。我猜它必须返回callstack并通过解析树,这将是非常昂贵的。

票数 2
EN

Stack Overflow用户

发布于 2010-05-27 14:20:48

即使变量名称和类型可能存在于MSIL代码中,当MSIL为JITted时,它也不会存在于本机代码中。

在JITting期间,将这种检查添加到本机代码中将是非常低效的--本质上是当指针被解除引用时的开销。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2918097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档