代码之家  ›  专栏  ›  技术社区  ›  Chris Cudmore

对象引用未设置为对象的实例:显示错误行号的堆栈跟踪

  •  0
  • Chris Cudmore  · 技术社区  · 6 年前

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

    概述: 这是一个中继器控件,允许教授在一次一个问题的情况下标记一个考试,同时仍然可以查看整个考试。

    <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:

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

    但实际的误差在下面几行。

    因为这个,我的疏忽花了很长时间才解决。你可以看到,我逐行分解了RepeaterItem的检索,并将 throw new Exception(xxx.GetType().ToString()

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

    1 回复  |  直到 6 年前
        1
  •  4
  •   Eric Lippert    6 年前

    堆栈跟踪中的行号可能出错的原因有很多。以下是一些:

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

    基本上,有三件事:源代码、生成的IL代码和包含描述源代码和IL之间关系的调试信息的PDB。 如果其中任何一个因为任何原因不匹配,那么它们就不匹配,