首页 > 解决方案 > 对象引用未设置为对象的实例:堆栈跟踪显示错误的行号

问题描述

我已经解决了这个问题(下面的解释),但我试图弄清楚为什么堆栈跟踪给了我错误的行。

概述:这是一个Repeater控件,允许教授标记考试,一次一个问题,同时仍然能够查看整个考试。

基本思想(pseudo.aspx):

<asp:repeater>
    <ItemTemplate>
    <fields/>
    <textbox id="grade">
    <asp:LinkButton ID="UpdateButton" runat="server" Text="Update" OnClick="OnUpdate" />
    </ItemTemplate>
</asp:repeater>

假设用户输入一个成绩,在 OnClick 事件中数据库中的问号被更新,整个页面再次被数据绑定。

代码:

protected void OnUpdate(object sender, EventArgs e)
{  // I broke this down line by line trying to trace the error. 
   LinkButton button = (LinkButton)sender; //Object Not set exception here!!! 
   object o = button.Parent;
   RepeaterItem item = o as RepeaterItem;
   int StudentID = int.Parse((item.FindControl("StudentKeyLabel1") as HiddenField).Value);
   string ExamID = (item.FindControl("ExamIDLabel1") as HiddenField).Value.Trim();
   int QuestionID = int.Parse((item.FindControl("QuestionIDLabel1") as HiddenField).Value);
   int Grade;
   try
   {
       Grade = int.Parse((item.FindControl("GradeTextBox") as TextBox).Text);
       // Update DB
   }
   catch (FormatException)
   { // Message to user - bad or missing grade }
   //Custom Databind
}

我已将 .aspx 中的字段从标签更改为 aspx 中的隐藏字段,但忘记在 .aspx.cs 文件中更改它们——这是错误的实际原因。

但是,堆栈跟踪 (customerrors="Off") 显示 Object 引用未设置为类型 Object 发生在这一行:

LinkButton button = (LinkButton)sender; //Object Not set error here!!!

但实际错误是下面几行。

因此,我的疏忽需要很长时间才能解决。您可以看到我逐行分解了对 RepeaterItem 的检索,并throw new Exception(xxx.GetType().ToString()在每一行试图弄清楚它之后放了一个来检查参考有效性。有趣的是,原来的错误并没有出现在手动抛出下方时。

为什么堆栈跟踪显示异常来自代码中的错误位置?

标签: c#asp.net

解决方案


堆栈跟踪中的行号可能错误的原因有很多。这里仅仅是少数:

  • 您在编译程序后编辑了代码。现在源代码行号和运行代码不匹配。
  • 您正在运行该程序的优化版本。优化可能会导致错误地报告行号。
  • 您已经使用 IL 注入工具修改了编译后的代码,现在生成的代码与调试信息不​​匹配。这可能会导致报告错误的行号。

基本上,有三样东西:源代码、生成的 IL 代码,以及包含描述源和 IL 之间关系的调试信息的 PDB。如果其中任何一个因任何原因不匹配,那么它们不匹配,因此您可以观察到它们不匹配。


推荐阅读