Подтвердить что ты не робот

В Java вы можете использовать отрицательный с подстрокой?

Может ли отрицательный использоваться в качестве конечного индекса для string.substring в Java?

Пример:

String str = "test";
str.substring(0, str.indexOf("q"));

Изменить: нигде в javadocs прямо не сказано, что endindex не может быть отрицательным. Существуют реализации подстроки в других языках и библиотеках, которые допускают отрицательный endindex, но disallow отрицательный beginindex, поэтому представляется, что это явно указано. Это никоим образом не подразумевается. (Edit: ok это подразумевается свободно, но я и, видимо, другие, которые задали мне этот вопрос лично, все еще находят его довольно неясным. Это должно было быть просто Q + A, которое я предоставил не мне, на самом деле пытаюсь найти ответ на этот тривиальный вопрос)

4b9b3361

Ответ 1

Нет. Отрицательные индексы не допускаются.

Из Строка # substring (int beginIndex, int endIndex):

Throws: IndexOutOfBoundsException - если beginIndex отрицательный или endIndex больше длины этого объекта String или beginIndex больше, чем endIndex.

Хотя в документации прямо не указано, что endIndex не может быть отрицательным 1 это можно получить. Переписывание соответствующих требований дает следующие факты:

  • "beginIndex не может быть отрицательным" → beginIndex >= 0
  • "beginIndex должен быть меньше или равен endIndex" → endIndex >= beginIndex

Таким образом, требование endIndex >= beginIndex >= 0 означает, что endIndex не может быть отрицательным.


Во всяком случае, str.substring(0, -x) можно тривиально переписать как str.substring(0, str.length() - x), предполагая, что мы имеем то же представление о том, что должен означать индекс отрицательного конца. Конечно, исходные требования к привязке все же применяются.


1 Любопытно, что String#subSequence явно запрещает отрицательный endIndex. Учитывая такое, он считает, что документация может быть очищена таким образом, что оба метода используют один и тот же упрощенный текст предварительного условия. (В качестве бонуса: в документации по SubSequence "Java 7" есть важная опечатка.)

Ответ 2

Нет, используя отрицательные числа для endindex подстроки, а также число, большее длины строки, приведет к исключению StringIndexOutOfBoundsException.

(Вы не поверите, как трудно было найти прямой ответ на это в сети)