我有一个奇怪的问题我在我的代码后面检查我的代码,如果他是活动的或者不是如此简单,如果..在我的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它已经完整..
我真的不知道为什么会这么讨厌,如果有人能解释我为什么会发生这种情况真的很酷
感谢您的帮助和快速回答
答案 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.SessionID
(source)。
如果您要在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
然后启用前四个复选框(可能),然后尝试调试项目。您将在将抛出异常的位置停止。