对象引用未设置为对象的实例(int)

时间:2013-04-18 16:22:57

标签: c# object reference set instance

这个错误不断出现,我似乎无法弄清楚它来自哪里。

if (!IsPostBack)
{
    DataTable LocalCart = new DataTable();
    LocalCart = (DataTable)Session["cart"];
    int LocalCartItemCount = (int) Session["CartItemCount"];
    Decimal LocalCartAmount = (Decimal)Session["CartAmount"];

    if (LocalCart.Rows.Count == 0)
    {
        titleLabel.Text = "Your shopping cart is empty!";
        GridCart.Visible = false;
        updateButton.Enabled = false;
        checkoutButton.Enabled = false;
        totalAmountLabel.Text = String.Format("{0:c}", 0);
    }
    else
    {
        GridCart.DataSource = LocalCart;
        GridCart.DataBind();
        titleLabel.Text = "These are the products in your shopping cart:";
        GridCart.Visible = true;
        updateButton.Enabled = true;
        checkoutButton.Enabled = true;
        totalAmountLabel.Text = String.Format("{0:c}", LocalCartAmount);
    }

它说错误在这里 - > int LocalCartItemCount = (int) Session["CartItemCount"];

3 个答案:

答案 0 :(得分:1)

您没有检查会话中是否存在密钥"CartItemCount"。如果它不存在,那么Session["CartItemCount"]的结果将返回null并在尝试将null转换为(int)时创建该错误。

答案 1 :(得分:1)

如果会话对象不存在,它将返回null,这将破坏转换。你应该考虑使用int.tryparse。如果成功,它将更新整数,否则它不会爆炸。

尝试以下代码

int LocalCartItemCount;
int.TryParse(Session["CartItemCount"].ToString(), out LocalCartItemCount);

计划b

int LocalCartItemCount = (int)(Session["CartItemCount"] ?? 0);

答案 2 :(得分:1)

嗯,第一个问题是Session["CartItemCount"]很可能是空的。由于您尝试在演员表中使用此空值,因此您收到对象引用错误。

这可以通过C#的??运算符来解决:

int LocalCartItemCount = (int)(Session["CartItemCount"] ?? 0);

这条线基本上是这方面的简写:

  
int LocalCartItemCount;
if(Session["CartItemCount"] != null)
    LocalCartItemCount = Session["CartItemCount"];
else
    LocalCartItemCount = 0;

只要Session["CartItemCount"]始终是整数,那就应该有效。但是,如果它不是整数,则可能会收到以下错误之一:

  • Specified cast is not valid
  • Cannot unbox 'Session["CartItemCount"]' as 'int'

如果存在上述错误的风险,那么您可能需要将其扩展为以下内容:

  
int LocalCartItemCount = 0;
if (Session["CartItemCount"] != null) 
{
    Int32.TryParse(Session["CartItemCount"].ToString(), out LocalCartItemCount);
}

但是,我通常不想在布尔表达式之外使用TryParse,但它仍然可以。

请记住,您需要对来自会话的任何对象进行类似的空检查。因此,对于评论中提到的LocalCart.Rows.Count == 0检查,我会将if更改为:

if(LocalCart != null && LocalCart.Rows.Count == 0)
{
    // do stuff here
}

或者,您可以使用上述??运算符。