Почему “из диапазона”, не брошенного для 'подстроки (startIndex, endIndex)'

В Java я использую substring() метод и я не уверены, почему он не бросает "из индекса" ошибка.

Строка abcde имеет индекс, запускаются от 0 до 4, но substring() метод берет startIndex и endIndex как аргументы на основе того, что я могу назвать foo.substring (0) и получить "abcde".

Затем, почему делает подстроку (5) работа? Тот индекс должен быть вне диапазона. Каково объяснение?

/*
1234
abcde
*/
String foo = "abcde";
System.out.println(foo.substring(0));
System.out.println(foo.substring(1));
System.out.println(foo.substring(2));
System.out.println(foo.substring(3));
System.out.println(foo.substring(4));
System.out.println(foo.substring(5));

Этот код выводы:

abcde
bcde
cde
de
e
     //foo.substring(5) output nothing here, isn't this out of range?

Когда я заменяю 5 6:

foo.substring(6)

Затем я получаю ошибку:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException:
    String index out of range: -1
18
задан Peter Mortensen 8 February 2018 в 20:16
поделиться

5 ответов

Согласно Java API doc, подстрока выдает ошибку, если начальный индекс больше длины строки.

IndexOutOfBoundsException - если beginIndex отрицателен или больше длины этого объекта String.

На самом деле, они приводят пример, очень похожий на ваш:

"emptiness".substring(9) returns "" (an empty string)

Я полагаю, это означает, что лучше всего думать о Java String как о следующем, где индекс обернут в |:

|0| A |1| B |2| C |3| D |4| E |5|

Что означает, что строка имеет начальный и конечный индекс.

21
ответ дан 30 November 2019 в 06:35
поделиться

Когда вы выполняете foo.substring(5), получается подстрока, начинающаяся с позиции сразу после "e" и заканчивающаяся в конце строки. Кстати, начальная и конечная позиции совпадают. Таким образом, получается пустая строка. Можно считать, что индекс - это не реальный символ в строке, а позиция между символами.

        ---------------------
String: | a | b | c | d | e |
        ---------------------
Index:  0   1   2   3   4   5
16
ответ дан 30 November 2019 в 06:35
поделиться

Из javadoc String API:

public String substring(int beginIndex)
    Returns a new string that is a substring of this 
    string. The substring begins with the "" character 
    at the specified index and extends to the end of this string.

public String substring(int beginIndex, int endIndex)
    Returns a new string that is a substring of this 
    string. The substring begins at the specified beginIndex 
    and extends to the character at index endIndex - 1. Thus 
    the length of the substring is endIndex-beginIndex.

Примеры:

"unhappy".substring(2) returns "happy" 
"Harbison".substring(3) returns "bison"
"emptiness".substring(9) returns "" (an empty string)

"hamburger".substring(4, 8) returns "urge"
"smiles".substring(1, 5) returns "mile"

Параметры:

beginIndex - the beginning index, inclusive.
Returns:
the specified substring.
Throws:
IndexOutOfBoundsException - if beginIndex is negative or 
larger than the length of this String object.

====

Так что это сделано специально. Если задать индекс как размер строки, то возвращается пустая строка.

3
ответ дан 30 November 2019 в 06:35
поделиться

Это потому, что функция подстроки возвращает «включающую» подстроку. Таким образом, индекс 5 указывает на место ДО конца строки, но ПОСЛЕ последнего отображаемого символа строки.

Это показано в документации: http://download.oracle.com/docs/cd/E17476_01/javase/1.4.2/docs/api/java/lang/String.html#substring (int)

3
ответ дан 30 November 2019 в 06:35
поделиться

substring (5) указывает на существующий индекс ... это просто указывает на пустую строку. С другой стороны, substring (6) - это просто бред. :)

2
ответ дан 30 November 2019 в 06:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: