O método Substring na classe String atinge o índice que não deveria duplicar

Esta pergunta já tem uma resposta aqui:

Por que "fora do intervalo" não é lançado para 'substring (startIndex, endIndex)' 6 respostas

Peço desculpas se o título não estiver claro.

Agora, no índice de strings começa em 0. Então, por exemplo:

Index    0   1   2   3   4
String   H   E   L   L   O

Nesse caso, o último índice é 4.

Se eu tentasse fazer algo assim:

System.out.println("hello".charAt(5));

Ele lançaria uma 'exceção de índice fora dos limites', como deveria.

No entanto, se eu tentar executar o seguinte código:

System.out.println("hello".substring(5));

Corre! Escrevi código semelhante, notei isso mais tarde e não consegui descobrir.

Eventualmente, a pergunta é: como isso é possível para alcançarmos esse índice? Permite escrever:

stringObj.substring(stringObj.length());

e não parece muito seguro, pois stringObj.length () nos retorna um número inteiro mais um do que o último índice.

É feito intencionalmente e isso tem um propósito? Em caso afirmativo, qual é esse objetivo e qual é o benefício que ele traz?

questionAnswers(4)

yourAnswerToTheQuestion