Java uses short circuit (sometimes called lazy) evaluation of boolean expressions. Specificially:
- If the left operand of an
&&(and) evaluates tofalse, the expression evaluates tofalse. The right operand is not evaluated. - If the left operand of an
||(or) evaluates totrue, the expression evaluates totrue. The right operand is not evaluated.
This behavior matters when evaluating the right operand would cause a runtime error or a change in state.
Example 1
int x = 5, y = 0;
System.out.println(y == 0 || x / y > 1);
The example prints: true
y == 0, the left operand of the ||, is evaluated first. 0 == 0 evaluates to true. The entire expression evaluates to true.
x / y > 1, the right operand of the ||, is not evaluated. This is important since evaluating 5 / 0 > 1 would result in an ArithmeticException for dividing by 0.
Example 2
String name = "Brandon";
// 0123456
System.out.println(name.length() >= 7 && name.substring(6, 7).equals("n"));
The example prints: true
name.length() >= 7, the left operand of the && is evaluated first. 7 >= 7 evaluates to true.
name.substring(6, 7).equals("n"), the right operand of the && is evaluated next. "n".equals("n") evaluates to true.
The entire expression evaluates to true.
Example 3
String name = "Horn";
// 0123
System.out.println(name.length() >= 7 && name.substring(6, 7).equals("n"));
The example prints: false
The boolean expression is the same as in Example 2; however, the String is shorter.
name.length() >= 7, the left operand of the && is evaluated first. 4 >= 7 evaluates to false. The entire expression evaluates to false.
name.substring(6, 7).equals("n"), the right operand of the &&, is not evaluated. This is important since evaluating "Horn".substring(6, 7) would result in a StringIndexOutOfBoundsException for accessing the non-existent character at index 6.
Additional resources
Help & comments
Get help from AP CS Tutor Brandon Horn