在 Windows 窗体中为简单的 NullReferenceException 堆栈跟踪
让我们创建一小段抛出异常的代码:
private void button1_Click(object sender, EventArgs e)
{
string msg = null;
msg.ToCharArray();
}
如果我们执行此操作,我们将获得以下异常和堆栈跟踪:
System.NullReferenceException: "Object reference not set to an instance of an object."
at WindowsFormsApplication1.Form1.button1_Click(Object sender, EventArgs e) in F:\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs:line 29
at System.Windows.Forms.Control.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
堆栈跟踪继续这样,但这部分足以满足我们的目的。
在堆栈跟踪的顶部,我们看到了这一行:
在 F:\ WindowsFormsApplication1 \ WindowsFormsApplication1 \ Form1.cs 中的 WindowsFormsApplication1.Form1.button1_Click(Object sender,EventArgs e):第 29 行
这是最重要的部分。它告诉我们发生异常的确切行:Form1.cs 中的第 29 行。
所以,这是你开始搜索的地方。
第二行是
在 System.Windows.Forms.Control.OnClick(EventArgs e)
这是调用 button1_Click
的方法。所以现在我们知道发生错误的 button1_Click
是从 System.Windows.Forms.Control.OnClick
调用的。
我们可以这样继续下去; 第三行是
在 System.Windows.Forms.Button.OnClick(EventArgs e)
反过来,这就是调用 System.windows.Forms.Control.OnClick
的代码。
堆栈跟踪是在代码遇到异常之前调用的函数列表。通过这样,你可以找出代码在遇到问题之前遵循的执行路径!
请注意,堆栈跟踪包括来自 .Net 系统的调用; 你通常不需要遵循所有的微软 System.Windows.Forms
代码来找出问题所在,只有属于你自己的应用程序的代码。
那么,为什么这被称为堆栈跟踪?
因为,每次程序调用一个方法时,它都会跟踪它的位置。它有一个称为堆栈的数据结构,它会转储它的最后一个位置。
如果执行完该方法,它会在堆栈上查看它在调用方法之前的位置 - 并从那里继续。
因此,在调用新方法之前,堆栈可以让计算机知道它停在哪里。
但它也可以作为调试帮助。就像一名侦探追踪犯罪分子犯罪时所采取的步骤一样,程序员可以使用堆栈来追踪程序在崩溃之前所采取的步骤。