当检查空值时,为什么会出现NullReferenceException异常?

3

我在以下代码行收到一个错误:对象引用未设置为对象的实例。

if (Session["AutoCompleteCustomersPhone"] != null)

完整的代码块:

代码块如下:

if (Session["AutoCompleteCustomersPhone"] != null)
    earchCustomerPhone = true;
else
{
    searchCustomerPhone =
        bool.Parse(Session["AutoCompleteCustomersPhone"].ToString());
}

在进行空值测试时,为什么会出现这个错误?

19
很可能,Session 本身就是 null - Daniel Hilgarth
这段代码确切运行在哪里?这可能会给我们一些线索,为什么会出现 Session 为空的情况... - greg84
这是在 ASMX Web 服务还是 WCF 中? - John Saunders
2个回答

10

你的if语句写反了。你试图在值null时使用它。

请改成:

if (Session["AutoCompleteCustomersPhone"] != null)

变成这样:

if (Session["AutoCompleteCustomersPhone"] == null)

我建议先修复这个问题,看看是否可以解决问题。

该特定行引发的异常可能是由于以下原因之一:

  • Session 变量为空 - 您可以在调试器中验证此信息。
  • 您编译的代码与您用于调试的源代码不同。尝试清理并重新构建。

1
+1 很好的发现,但这不会导致在这行代码上出现异常。 - Adam Houldsworth
@greg84 是的,在else语句中,但我很好奇为什么异常报告在“if”中,因此我修改了“在这一行特定的位置”的说法。 - Adam Houldsworth
这就是为什么使用“not”逻辑编写if语句会让人陷入麻烦的原因。@Mark是正确的,你的if语句是反向的。 - mgnoonan
我最初尝试了这个,但失败了。所以我改用!=,当它也不起作用时,我才发布了问题。谢谢! - Kevin
2
@Kevin 如果你切换了它,那么你的代码逻辑上就不正确了。当异常发生时,你可以查看当前范围内每个变量的值。如果其中任何一个为空,那么该值将显示为 null。检查你的 Session 对象。 - Adam Houldsworth
您最初的建议是/仍然正确的。会话为空,因为此代码位于Web服务中。很抱歉没有提到它。我没有意识到这会对代码造成问题。 - Kevin

4

因为会话对象本身为空

我认为您正在使用Web服务,这就是会话为空的原因*

如果您正在使用Web服务,请查看此文章:在Web服务中使用会话状态


你说得没错,这是一个Web服务。我想我的下一个问题是:在Web服务中是否可以使用Session?不过那是另一个话题了。谢谢。 - Kevin
@Kevin - 请查看我粘贴的文章链接,解决你的问题。 - Pranay Rana

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接