【发布时间】: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)。因此,在您的示例中,第一个条件是 alwaystrue与该输入。但是,当它尝试访问split[1]时,您将超出数组的范围,因此它会抛出IndexOutOfBoundsException,正如其他人之前提到的那样。因此问题不在于您向我们展示的代码(再次:隔离它!)。
标签: java short-circuiting