1

我在某处读到,一旦 If 语句达到 True 布尔值,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

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

4

3 回答 3

5

您正在使用&而不是&&. 前者是按位 AND 并将始终评估双方。后者代表逻辑与并将进行短路条件评估。

更多信息:Java 教程:运算符

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

if( !currentFragment.getTag().equals(PROFILE) ||
    ( currentFragment.getArguments() != null &&
    currentFragment.getArguments().getInt("authorId") != userId) ) { }
于 2013-09-02T14:56:48.187 回答
1
& - Bitwise operator for AND
&& - Logical AND (AND gate of Digital logic)

逻辑与&&执行短路

于 2013-09-02T14:58:33.190 回答
1

“&”和“|” 有两种含义,取决于它们的操作数。应用于整数,它们分别是按位与和或。应用于布尔操作数,它们是逻辑 AND 和 OR 的非短路版本。

人们经常忘记他们的逻辑运算符的含义,因为我们几乎总是使用短路等效项,“&&”和“||”。

于 2013-09-02T15:05:04.830 回答