Нужна помощь в выяснении NullReferenceException - PullRequest
1 голос
/ 04 мая 2011

Я получаю исключение NullReferenceException в своем коде для приложения Facebook IFRAME. За свою жизнь я не могу понять, почему я это получаю.

Survey s = Survey.find(myUserID);

List<Survey> list = s.FindMatches(rdblResultsType.SelectedIndex);

if (list.Count > 0)

{
    lblResultsCount.Text = list.Count + " survey match" + (list.Count == 1 ? "" : "es");

    rdblResultsType.Items[1].Text = s.onCampus ? "On Campus" : "Off Campus";

    tblResults.Visible = true;

    foreach (Survey p in list)

        tblResults.Rows.Add(CreateRequestRow(null, p)); //Error taking place here

    TableRow footer = new TableRow();

    TableCell bottomcell = new TableCell();

    bottomcell.ColumnSpan = 2;

    bottomcell.Text = "<br/><br/>";

    footer.Cells.Add(bottomcell);

    tblResults.Rows.Add(footer);

}

А вот и метод CreateRequestRow:

protected TableRow CreateRequestRow(RoommateRequest r, Survey s)
{

        long uid = (r != null ? ((r.RequesteeID == myUserID) ? r.RequesterID : r.RequesteeID) : s.facebookID.Value);
        //Facebook.Schema.user user = Api.Users.GetInfo(r != null ? ((r.RequesteeID == myUserID) ? r.RequesterID : r.RequesteeID) : s.facebookID.Value);

        TableRow tr = new TableRow();
        TableCell c1 = new TableCell();


        TableCell c2 = new TableCell();

        Button link = new Button();
        link.CssClass = "linkbutton";
        link.CommandArgument = uid.ToString();

        link.Text = s != null ? s.app.Name : (((r.RequesteeID == myUserID) ? r.RequesterName : r.RequestedName));
        if (link.Text.Trim() == "") link.Text = "Facebook User";



        link.Click += new EventHandler(btnView_Click);
        c2.Controls.Add(link);

        if (r != null)
        {
            c2.Controls.Add(new LiteralControl("<br/>"));
            c2.Controls.Add(new LiteralControl(r.DateSent.ToShortDateString()));

            if (r.Closed)
                c2.Controls.Add(new LiteralControl("<br/>Request Closed"));
            else if (r.Accepted)
                c2.Controls.Add(new LiteralControl("<br/><b>Accepted</b>"));
            else c2.Controls.Add(new LiteralControl("<br/>Awaiting Reply"));

        }

        tr.Cells.Add(c1);
        tr.Cells.Add(c2);
        return tr;




}

Мне удалось пройти через метод CreateRequestRow без выдачи ошибки, но, похоже, это происходит, когда возвращаемый TableRow добавляется в tblResults.

Любая помощь будет принята с благодарностью.

РЕДАКТИРОВАТЬ: Забыли трассировку стека.

[NullReferenceException: ссылка на объект не установлена ​​для экземпляра объекта.] Facebook_DisplayRequests.CreateRequestRow (RoommateRequest r, Survey s) +313 Facebook_DisplayRequests.UpdateRequests () +2389 Facebook_DisplayRequests.Page_Load (Отправитель объекта, EventArgs e) +343 System.Web.Util.CalliHelper.EventArgFunctionCaller (IntPtr fp, Объект o, Объект t, EventArgs e) +14 System.Web.Util.CalliEventHandlerDelegateProxy.Callback (Отправитель объекта, EventArgs e) +35 System.Web.UI.Control.OnLoad (EventArgs e) +99 Facebook_Graph_Toolkit.CanvasPage.OnLoad (EventArgs e) +772 System.Web.UI.Control.LoadRecursive () +50 System.Web.UI.Page.ProcessRequestMain (логическое значение includeStagesBeforeAsyncPoint, логическое значение includeStagesAfterAsyncPoint) + 627

Ответы [ 2 ]

3 голосов
/ 04 мая 2011

Я думаю, что эта строка:

   link.Text = s != null ? s.app.Name : (((r.RequesteeID == myUserID) ? r.RequesterName : r.RequestedName));  

сгенерирует объект ref, не установленный, потому что "r" равно нулю.Условное выражение основано на переменной «s», и вы свободно используете «r».

Редактировать: Кстати, для более эффективной отладки вы должны перейти к «Отладка / Исключения» и включить точки останова при определенных исключенияхпроисходят, как это:

enter image description here

2 голосов
/ 04 мая 2011
link.Text = s != null ? s.app.Name : (((r.RequesteeID == myUserID) ? r.RequesterName : r.RequestedName));

вы не проверяете, что r здесь не равно нулю, и r будет использоваться, если s == null.Это может не быть вашей проблемой, но это определенно приведет к ошибке.

...