在 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 代码来找出问题所在,只有属于你自己的应用程序的代码。

那么,为什么这被称为堆栈跟踪
因为,每次程序调用一个方法时,它都会跟踪它的位置。它有一个称为堆栈的数据结构,它会转储它的最后一个位置。
如果执行完该方法,它会在堆栈上查看它在调用方法之前的位置 - 并从那里继续。

因此,在调用新方法之前,堆栈可以让计算机知道它停在哪里。

但它也可以作为调试帮助。就像一名侦探追踪犯罪分子犯罪时所采取的步骤一样,程序员可以使用堆栈来追踪程序在崩溃之前所采取的步骤。