Java всегда оценивает слева направо.Итак, это:
s.charAt(i)!=s.charAt(i+1) || i+1>=s.length()
Оценивает s.charAt(i+1)
до того, как проверит i+1>=s.length()
.Когда i+1 >= s.length()
, s.charAt(i+1)
потерпит неудачу, потому что он находится за концом строки.
Обратный порядок операндов:
i+1>=s.length() || s.charAt(i)!=s.charAt(i+1)
Поскольку ||
является коротким-circuiting оператор, это оценивает s.charAt(i)!=s.charAt(i+1)
только если i+1>=s.length()
ложно, поэтому он не завершится с исключением в этом случае.