java - Java 是运行每个条件运算符还是在 If 语句中短路?

标签 java if-statement conditional-operator

我在某处读到,一旦 If 语句达到 True boolean 值,Java 就应该“短路”。但是,我目前在以下代码中遇到空指针异常(我已针对此问题进行了简化):

currentFragment.setTag(HOME);
if( !currentFragment.getTag().equals(PROFILE) | 
        ( currentFragment.getArguments() != null &  
        currentFragment.getArguments().getInt("authorId") != userId) ) { }

Android 开发人员会知道 setTag() 不是真正的方法,但在我的实际代码中,我已通过错误记录确保 currentFragment.getTag() != PROFILE。但是,当这段代码运行时,它会在

处引发空点异常
currentFragment.getArguments().getInt("authorId") != userId

它应该在 | 之前的第一个条件下短路(或)运算符。如果做不到这一点,下一行应该确保 getArguments() != null,那么为什么它一直到最终条件呢?任何人都可以解释这里发生的事情的内部运作。谢谢。

最佳答案

您正在使用 & 而不是 &&。前者是按位与运算,总是 计算双方。后者代表逻辑与,将进行短路条件评估。

更多信息:Java Tutorials: Operators

您当前问题的解决方案:使用逻辑与 && 而不是按位与 &。与您的按位或 | 类似。

if( !currentFragment.getTag().equals(PROFILE) ||
    ( currentFragment.getArguments() != null &&
    currentFragment.getArguments().getInt("authorId") != userId) ) { }

关于java - Java 是运行每个条件运算符还是在 If 语句中短路?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18576032/

相关文章:

java - 使用不同的扩展重构 else-if 运算符?

java - 无法从 ArrayList 中找到项目?

Java 对象与对象数组

c# - 检查整数是否== null

excel - MS Excel 中的多个嵌套 IF 语句 - 括号不对?

perl - 奇怪的 Perl 条件运算符行为

javascript - 相同的表达但不同的结果

java - 为什么三元运算符会意外地转换整数?

android 中的 Java 正则表达式

java - 在 xml 文件上添加除 main 之外的按钮