Java 如果条件未正确短路

Java 如果条件未正确短路,java,short-circuiting,Java,Short Circuiting,我有一个计算电子邮件地址的if条件。我在测试两件事 它有一个“@”符号 在第一个@符号之后,它以“gmail.com”结尾 我对短路的理解是,如果OR(| |)语句中的第一个条件为真,那么第二个条件将不会被计算。但是我得到了一个NullPointerException,因为第二个语句确实得到了计算(我已经测试过了) 我对这里短路有什么不理解 相关代码如下: 仅供参考:emailtext来自EditText元素,在本例中为“notavalidemail” 代码中的日志将返回以下内容: 05-0

我有一个计算电子邮件地址的
if
条件。我在测试两件事

  • 它有一个“@”符号
  • 在第一个@符号之后,它以“gmail.com”结尾
我对短路的理解是,如果OR(| |)语句中的第一个条件为真,那么第二个条件将不会被计算。但是我得到了一个
NullPointerException
,因为第二个语句确实得到了计算(我已经测试过了)

我对这里短路有什么不理解

相关代码如下:

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

代码中的日志将返回以下内容:

05-02 13:51:16.447  27553-27553/com.farmsoft.lunchguru.app I/GetToken﹕ Split[0]=notavalidemail; length=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
    }

它如何导致NullPointerException?如果确实是
length=1
的情况,则应获得IndexOutOfBoundsException;但这是不可能的,
|
真的是短路。你能为我们提供一个引起这个问题的输入的可复制的例子吗?这样我们就可以自己运行它(更重要的是:它通常帮助您自己找到它,因为您隔离了问题区域)。显然,
split[1]
null
。如果从语句中删除not,会发生什么?我记得在对一个不存在的字符(在您的例子中:
@
)进行orA拆分之前,没有对其求值。orA将返回一个包含1个元素的数组:整个输入字符串(aka:
.length==1
将为
true
)。因此,在您的示例中,对于该输入,第一个条件总是
true
。但是,当它试图访问
split[1]
时,您超出了数组的边界,因此它将抛出
IndexOutOfBoundsException
,正如其他人之前所指出的那样。因此,问题不在您向我们展示的代码中(再次:隔离它!)。
    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
    }