1

I was reading a book, and saw this code:

public Animal getWinner(List<Animal> animals) {
    return animals == null || animals.size() == 0 ? null : animals.get(0);
}

The latter expression is fine as it returns an Animal or null. The former expression is puzzling though, as it's just a boolean expression.

I made a test class and called getWinner(null). It returned null. As far as I know, animals == null would be true, the expression would short-circuit, and I expect the method to return true instead of null.

How does this line compile, and even work as expected?

1 Answers1

3

This has to do with operator precedence in Java and which operator - the boolean or the ternary, will be executed first.

The ternary has lower precedence, so the or will be evaluated first, meaning it would look like this with parenthesis:

return (animals == null || animals.size() == 0) ? null : animals.get(0);

So the result of the entire line is either to return null or return animals.get(0).

Samuel Liew
  • 76,741
  • 107
  • 159
  • 260
oligofren
  • 20,744
  • 16
  • 93
  • 180