【问题标题】:I want to understand AND (&&) run time exception [duplicate]我想了解 AND (&&) 运行时异常 [重复]
【发布时间】:2019-01-10 07:51:28
【问题描述】:

大家好,今天我正在制作 API。当我看到 C# 编译器的不同行为时,我感到很困惑。让我解释一下:

我得到异常:

If(userLoginModel.UserId>0)
{
//do something
}
else{
//do something
}

异常:{“对象引用未设置为对象的实例。”}

是的,它是空的; 但是如果写:

if (userLoginReturnModel != null && userLoginReturnModel.UserId >0)
{
//do something
}
else
{
//do something
}

这段代码没有抛出任何异常。

注意:我的问题是为什么编译器不会在第二个代码上抛出任何异常,因为如果存在 && 条件,那么当编译器检查 userLoginReturnModel.userId > 0 时,这也需要抛出异常,因为对象是空值。正如我们所知,这两个条件都将在 if 中进行检查。任何有很好解释的答案。

【问题讨论】:

  • 如果我让您从书柜中取回我的书,但我没有书柜,那就有问题了 - 对吧?与 null 相同。如果您尝试访问userLoginReturnModel 的实例,但您没有,那就是个问题。 && 使 if 语句短路,因此它永远不会执行后半部分。
  • 请再次阅读问题@John。谢谢
  • 您的第一条评论不匹配。
  • @John 问题实际上是为什么在第二个示例中只检查第一个条件。
  • @John,问题是关于&& 的行为以及它如何避免 NullReferenceException,而不是如何解决一个问题,因此不可能被骗问题

标签: c# exception-handling compiler-errors nullreferenceexception


【解决方案1】:

如果发生:

if (userLoginReturnModel != null && userLoginReturnModel.UserId >0)

如果第一个条件为假,则不检查下一个(因为没有必要这样做 - 假 && 任何东西都会给出假)。

类似于 || - 如果第一个为真,则不检查下一个(不需要 - 真 || 任何东西都为真)。

【讨论】:

【解决方案2】:

在这种情况下,如果 userLoginReturnModel 为 null,您将拥有:

if ( false && ...

假后需要检查条件吗? False && true 仍然是错误的。所以其余条件无关紧要,不会被检查。

【讨论】:

    猜你喜欢
    • 2019-08-29
    • 2013-09-19
    • 2014-07-20
    • 1970-01-01
    • 2013-08-07
    • 1970-01-01
    • 2015-01-22
    • 2015-10-04
    • 1970-01-01
    相关资源
    最近更新 更多