В 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
Согласно 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|
Что означает, что строка имеет начальный и конечный индекс.
Когда вы выполняете foo.substring(5)
, получается подстрока, начинающаяся с позиции сразу после "e" и заканчивающаяся в конце строки. Кстати, начальная и конечная позиции совпадают. Таким образом, получается пустая строка. Можно считать, что индекс - это не реальный символ в строке, а позиция между символами.
---------------------
String: | a | b | c | d | e |
---------------------
Index: 0 1 2 3 4 5
Из 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.
====
Так что это сделано специально. Если задать индекс как размер строки, то возвращается пустая строка.
Это потому, что функция подстроки возвращает «включающую» подстроку. Таким образом, индекс 5 указывает на место ДО конца строки, но ПОСЛЕ последнего отображаемого символа строки.
Это показано в документации: http://download.oracle.com/docs/cd/E17476_01/javase/1.4.2/docs/api/java/lang/String.html#substring (int)
substring (5) указывает на существующий индекс ... это просто указывает на пустую строку. С другой стороны, substring (6) - это просто бред. :)