休息一个不应该发生的私有变量

时间:2013-08-20 09:10:17

标签: c# asp.net

我有一个奇怪的问题我在我的代码后面检查我的代码,如果他是活动的或者不是如此简单,如果..在我的Page_Load方法中,你可以在这里看到

    private TimeReport paramTR;
    private ZevUser zevUser;
    protected void Page_Load(object sender, EventArgs e)
    {
        ZevUser user = ZevUser.GetById(Int32.Parse(Session["SessionId"].ToString()));
        if (user == null)
        {
            this.Response.Redirect("~/About.aspx");
        }
        this.getParameters();

        if (!this.IsPostBack)
        {
            if (paramTR.ZevUser.Active == 0)
            {
                this.Response.Redirect("~/TimeReporting/TimeReportPanel.aspx");
            }

            this.bindData();
        }


    }

但是当我向这个方法投掷时,我得到了allays nullreferenceexception 为什么这么做..但是私有的ZevUser变量不是null它已经完整..

我真的不知道为什么会这么讨厌,如果有人能解释我为什么会发生这种情况真的很酷

感谢您的帮助和快速回答

4 个答案:

答案 0 :(得分:2)

如果无法在本地调试此代码,则需要中断代码以便更轻松地调试代码或添加日志记录。

请记住,在调试某些内容时,您可以做出的更糟糕的错误就是做出假设。从头开始,然后按照过程进行操作。不要认为的问题,并且不要认为问题不能

我在下面添加了一个细分,更易阅读的版本。您现在可以在此处添加日志记录或轻松添加断点:

private TimeReport paramTR;
private ZevUser zevUser;

protected void Page_Load(object sender, EventArgs e)
{
    this.getParameters();

    if (!this.IsPostBack)
    {
        if ((this.paramTR != null) &&
            (this.paramTR.ZevUser != null) &&
            (this.paramTR.ZevUser.Active == 0))
        {
            this.Response.Redirect("~/TimeReporting/TimeReportPanel.aspx");
        }

        this.bindData();
    }

    string sessionId = Session["SessionId"] as string;

    if (sessionId != null)
    {
        int session = int32.Parse(sessionId);

        ZevUser user = ZevUser.GetById(session);

        if (user == null)
        {
            this.Response.Redirect("~/About.aspx");
        }
    }
}

为什么要将会话ID传递给ZevUser.GetById()?我希望这会占用用户ID,或者调用类似ZevUser.GetBySessionId()的方法。目前它很混乱。

答案 1 :(得分:1)

此行导致问题:

ZevUser user = ZevUser.GetById(Int32.Parse(Session["SessionId"].ToString()));

这是因为Session["SessionId"]可以为null,在这种情况下为null。

如果您希望获得由ASP.net设置的SessionId,请使用this.Session.SessionIDsource)。

如果您要在Session["SessionId"]中存储要检索的值,请先进行空检查:

if (Session["SessionId"] != null) { ...

答案 2 :(得分:0)

在使用之前,您应该考虑测试SessionId变量:

if (!string.IsNullOrEmpty(Session["SessionId"].ToString()))
    ZevUser user = ZevUser.GetById(Int32.Parse(Session["SessionId"].ToString()));

答案 3 :(得分:0)

调试异常的最佳方法是在抛出异常时启用调试。 为此,请转到Debug>> Exceptions

enter image description here

然后启用前四个复选框(可能),然后尝试调试项目。您将在将抛出异常的位置停止。