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

Oma*_*ani 1 java if-statement conditional-operator

我在某处看到,一旦If语句达到True布尔值,Java就应该"短路".但是,我目前遇到以下代码中的空指针异常(我已经为此问题简化了):

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

Android开发人员会知道setTag()不是一个真正的方法,但在我的实际代码中,我通过错误记录确保了currentFragment.getTag()!= PROFILE.但是,当此代码运行时,它会导致零点异常

currentFragment.getArguments().getInt("authorId") != userId
Run Code Online (Sandbox Code Playgroud)

它应该在|之前的第一个条件下短路 (或)运营商.如果失败了,下一行应该确保getArguments()!= null,那么为什么它会一直到最终条件呢?可以解释这里发生的事情的内部运作.谢谢.

Lui*_*oza 5

你用的是&代替&&.前者是按位AND,将始终评估双方.后者代表逻辑AND,并将进行短路条件评估.

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

解决当前问题:使用逻辑AND &&而不是按位AND &.类似于你的按位OR |.

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