【问题标题】:If conditions are not short-circuiting correctly [closed]如果条件没有正确短路[关闭]
【发布时间】:2014-06-19 12:03:50
【问题描述】:

我有一个评估电子邮件地址的if 条件。我正在测试两件事

  • 它有一个“@”符号
  • 在第一个 @ 符号之后,它以“gmail.com”结尾。

我对短路的理解是,如果 OR (||) 语句中的第一个条件为真,则不会评估第二个条件。然而我得到了一个NullPointerException,因为第二个语句确实得到了评​​估(我已经测试过了)。

关于这里的短路,我有什么不明白的地方?

相关代码如下:

仅供参考:emailtext 来自 EditText 元素,在本例中为“notavalidemail”

String[] split = emailtext.split("@", 2);
final AlertDialog.Builder notifier = new AlertDialog.Builder(this);
Log.i("GetToken","Split[0]=" + split[0] + "; length=" + split.length);

if (split.length == 1 || !split[1].equals("gmail.com")) {
    //Tell the user they didn't enter a correct gmail
}

代码中的日志返回:

05-02 13:51:16.447  27553-27553/com.farmsoft.lunchguru.app I/GetToken﹕ Split[0]=notavalidemail; length=1

【问题讨论】:

  • 怎么会导致 NullPointerException?如果length=1 确实是这种情况,你应该得到一个IndexOutOfBoundsException;但这是不可能的,|| 真的是短路了。
  • 您能否为我们提供一个可重现的示例,其中包含导致此问题的输入?这样我们就可以自己运行它(更重要的是:它通常可以帮助您自己找到它,因为您隔离了问题区域)
  • 嗯,显然split[1]null
  • 如果从语句中删除 not 会发生什么?我记得一些关于之前没有被评估的事情或
  • 对不存在的字符(在您的情况下为:@)进行拆分将返回一个包含 1 个元素的数组:整个输入字符串(又名:.length == 1 将是 true)。因此,在您的示例中,第一个条件是 always true 与该输入。但是,当它尝试访问split[1] 时,您将超出数组的范围,因此它会抛出IndexOutOfBoundsException,正如其他人之前提到的那样。因此问题不在于您向我们展示的代码(再次:隔离它!)。

标签: java short-circuiting


【解决方案1】:

使用此代码来避免问题:

    String[] split = emailtext.split("@", 2);

    final AlertDialog.Builder notifier = new AlertDialog.Builder(this);
    Log.i("GetToken","Split[0]=" + split[0] + "; length=" + split.length);

    boolean errorMail = true;
    if(split.length == 2)
    {
        if(split[1].equals("gmail.com"))
        {
            errorMail = false;
        }
    }
    if(errorMail)
    {
        // Mail error
    }

【讨论】:

    猜你喜欢
    • 2014-03-14
    • 2014-03-03
    • 1970-01-01
    • 1970-01-01
    • 2014-05-10
    • 2021-01-24
    • 1970-01-01
    • 2017-02-13
    • 2012-11-12
    相关资源
    最近更新 更多