在我看来,我的大量调试时间都花在跟踪复杂语句中的空引用异常上。例如:
For Each game As IHomeGame in _GamesToOpen.GetIterator()为什么,当我得到一个NullReferenceException时,我可以得到堆栈跟踪中的行号,但不能得到等于null的对象的名称。换句话说,为什么:
Object reference not set to an instance of an object.而不是
_GamesToOpen is not set to an instance of an object.或
Anonymous object returned by _GamesToOpen.GetIterator() is null.或
game was set to null.这是严格意义上的设计选择,意在保护代码的匿名性,还是编译器设计中有一个令人信服的理由不将此信息包括在调试时异常中?
发布于 2009-02-23 18:34:21
异常是运行时的东西,变量是编译时的东西。
实际上,示例中的变量是一个表达式。表达式并不总是简单的变量。在运行时,将计算表达式,并在结果对象上调用该方法。如果该表达式的值为null,则运行时将抛出NullReferenceException。假设如下所示:
Dim a as New MyObject
Dim b as String = MyObject.GetNullValue().ToString()如果GetNullValue()方法返回null,则运行时应返回什么错误消息
发布于 2009-02-23 19:23:00
对于像Java这样被编译成由VM解释的字节码的语言,假设您有一个带有字段x的X类,对于某个引用,它的值是null。如果你写
x.foo()字节码可能如下所示:
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,不能也不知道该空引用来自何处。
发布于 2009-02-23 18:36:26
有一种简单的方法可以捕获它以进行调试,即在使用对象之前放置一个断言语句,检查是否为null并输出有意义的消息。
https://stackoverflow.com/questions/578734
复制相似问题