关于这个.NET未处理的异常消息:
你调用的对象是空的.
为什么.NET不显示哪个对象null
?
我知道我可以检查null
并解决错误.但是,为什么.NET没有帮助指出哪个对象具有空引用以及哪个表达式触发了NullReferenceException
?
Mar*_*age 169
(有关Visual Studio 2017中新的异常帮助程序的信息,请参阅此答案的结尾)
考虑以下代码:
String s = null;
Console.WriteLine(s.Length);
Run Code Online (Sandbox Code Playgroud)
这将抛出NullReferenceException
第二行,你想知道为什么.NET没有告诉你,s
抛出异常时它是null.
要理解为什么你没有得到那条信息,你应该记住它不是执行C#源而是IL:
IL_0001: ldnull IL_0002: stloc.0 // s IL_0003: ldloc.0 // s IL_0004: callvirt System.String.get_Length IL_0009: call System.Console.WriteLine
它是callvirt
抛出的操作码,NullReferenceException
当评估堆栈上的第一个参数是空引用(使用加载的参数)时,它会执行此操作ldloc.0
.
如果.NET应该能够告诉它是s
一个空引用,它应该以某种方式跟踪评估栈的第一个参数来源于表单s
.在这种情况下,我们很容易看到它是s
null,但是如果值是来自另一个函数调用的返回值并且没有存储在任何变量中该怎么办?无论如何,这种信息不是您想要在.NET虚拟机之类的虚拟机中跟踪的信息.
为了避免这个问题,我建议你在所有公共方法调用中执行参数null检查(除非你允许空引用):
public void Foo(String s) {
if (s == null)
throw new ArgumentNullException("s");
Console.WriteLine(s.Length);
}
Run Code Online (Sandbox Code Playgroud)
如果将null传递给该方法,则会得到一个异常,该异常可以准确地描述问题所在(s
即为null).
四年后,Visual Studio 2017现在有了一个新的异常助手,它将尝试在抛出时告诉什么是null NullReferenceException
.当它是null的方法的返回值时,它甚至能够为您提供所需的信息:
请注意,这仅适用于DEBUG构建.
您希望以下情况中的错误消息如何?
AnyObject.GetANullObject().ToString();
private object GetANullObject()
{
return null;
}
Run Code Online (Sandbox Code Playgroud)
这里没有变量名称要报告!
归档时间: |
|
查看次数: |
34168 次 |
最近记录: |