-1

Given that example code:

boolean foo(String arg)
{
    if( arg != null && arg.equalsIgnoreCase("bar") )
        //Do something
}

Do I have guarantee that equalsIgnoreCase() is only called if arg is not null ?

VoidStar
  • 936
  • 1
  • 7
  • 17

2 Answers2

3

Yes, Java does offer short-cicuiting for conditionals, operating from left to right.

JLS states:

The conditional-and operator && is like & (§15.22.2), but evaluates its right-hand operand only if the value of its left-hand operand is true.


If the resulting value is false, the value of the conditional-and expression is false and the right-hand operand expression is not evaluated.

If the value of the left-hand operand is true, then the right-hand expression is evaluated; if the result has type Boolean, it is subjected to unboxing conversion (§5.1.8). The resulting value becomes the value of the conditional-and expression.

nanofarad
  • 40,330
  • 4
  • 86
  • 117
1

Yes, Java will guarantee that equalsIgnoreCase is only called if arg is not null. It will evaluate its operands from left to right, and in the case of && (and ||), it will not evaluate the right operand if it doesn't need to evaluate it.

Section 15.23 of the JLS states:

The conditional-and operator && is like & (§15.22.2), but evaluates its right-hand operand only if the value of its left-hand operand is true.

and

At run time, the left-hand operand expression is evaluated first; if the result has type Boolean, it is subjected to unboxing conversion (§5.1.8).

If the resulting value is false, the value of the conditional-and expression is false and the right-hand operand expression is not evaluated.

Community
  • 1
  • 1
rgettman
  • 176,041
  • 30
  • 275
  • 357