首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么空引用异常不能命名具有空引用的对象?

为什么空引用异常不能命名具有空引用的对象?
EN

Stack Overflow用户
提问于 2009-02-23 18:30:27
回答 5查看 3.2K关注 0票数 16

在我看来,我的大量调试时间都花在跟踪复杂语句中的空引用异常上。例如:

代码语言:javascript
运行
复制
For Each game As IHomeGame in _GamesToOpen.GetIterator()

为什么,当我得到一个NullReferenceException时,我可以得到堆栈跟踪中的行号,但不能得到等于null的对象的名称。换句话说,为什么:

代码语言:javascript
运行
复制
Object reference not set to an instance of an object.

而不是

代码语言:javascript
运行
复制
_GamesToOpen is not set to an instance of an object.

代码语言:javascript
运行
复制
Anonymous object returned by _GamesToOpen.GetIterator() is null.

代码语言:javascript
运行
复制
game was set to null.

这是严格意义上的设计选择,意在保护代码的匿名性,还是编译器设计中有一个令人信服的理由不将此信息包括在调试时异常中?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-02-23 18:34:21

异常是运行时的东西,变量是编译时的东西。

实际上,示例中的变量是一个表达式。表达式并不总是简单的变量。在运行时,将计算表达式,并在结果对象上调用该方法。如果该表达式的值为null,则运行时将抛出NullReferenceException。假设如下所示:

代码语言:javascript
运行
复制
Dim a as New MyObject
Dim b as String = MyObject.GetNullValue().ToString()

如果GetNullValue()方法返回null,则运行时应返回什么错误消息

票数 11
EN

Stack Overflow用户

发布于 2009-02-23 19:23:00

对于像Java这样被编译成由VM解释的字节码的语言,假设您有一个带有字段xX类,对于某个引用,它的值是null。如果你写

代码语言:javascript
运行
复制
x.foo()

字节码可能如下所示:

代码语言:javascript
运行
复制
push Xref           >> top of stack is ref to instance of X with X.x = null
getField x          >> pops Xref, pushes 'null' on the stack
invokeMethod foo    >> pops 'null' -> runtime exception

关键是,需要堆栈上的非空引用才能对其进行操作的操作,如示例中的invokeMethod,不能也不知道该空引用来自何处。

票数 3
EN

Stack Overflow用户

发布于 2009-02-23 18:36:26

有一种简单的方法可以捕获它以进行调试,即在使用对象之前放置一个断言语句,检查是否为null并输出有意义的消息。

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

https://stackoverflow.com/questions/578734

复制
相关文章

相似问题

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