codePointAt
принимает индекс char
.
Индекс относится к значениям символов (кодовые единицы Unicode) и находится в диапазоне от 0
до length() - 1
.
В этой строке шесть кодовых точек. Вызов offsetByCodePoints
возвращает индекс после 6 кодовых точек, который является char-index 7. Затем вы пытаетесь получить codePointAt(7)
, который находится в конце строки.
Чтобы понять почему, рассмотрим, что
"".offsetByCodePoints(0, 0) == 0
потому что, чтобы считать все 0 кодовых точек, вы должны считать все 0 char
с.
Экстраполируя это на вашу строку, чтобы считать все кодовые точки 6
, вы должны считать все 7 char
с.
Может быть, видение codePointAt
в использовании прояснит это. Это идиоматический способ перебора всех кодовых точек в строке (или CharSequence
):
for (var charIndex = 0, nChars = s.length(), codepoint;
charIndex < nChars;
charIndex += Character.charCount(codepoint)) {
codepoint = s.codePointAt(charIndex);
// Do something with codepoint.
}