在我看来,我的很多调试时间花在追踪复杂语句中的空引用异常上.例如:
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.
这是一个严格的设计选择,是为了保护代码的匿名性,还是编译器设计中有一个令人信服的理由不在调试时异常中包含这些信息?
例外是运行时事物,变量是编译时间的东西.
实际上,示例中的变量是一个表达式.表达式并不总是简单的变量.在运行时,将计算表达式,并在结果对象上调用该方法.如果该表达式的值为null
,则运行时将抛出一个NullReferenceException
.假设如下:
Dim a as New MyObject Dim b as String = MyObject.GetNullValue().ToString()
如果GetNullValue()
方法返回,运行时应返回什么错误消息null
?