Ответ 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" есть важная опечатка.)