El método de subcadena en la clase String alcanza el índice que no debe [duplicar]

Esta pregunta ya tiene una respuesta aquí:

¿Por qué no está "fuera de rango" para 'subcadena (startIndex, endIndex)' 6 respuestas

Pido disculpas si el título no está claro.

Ahora, el índice de cadenas comienza en 0. Entonces, por ejemplo:

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

En este caso, el último índice es 4.

Si intentara hacer algo como esto:

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

Lanzaría una 'excepción de índice fuera de límites', como debería ser.

Sin embargo, si intento ejecutar el siguiente código:

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

¡Corre! Escribí un código similar, lo noté más tarde y no pude resolverlo.

Finalmente, la pregunta es: ¿cómo es posible que podamos alcanzar este índice que no deberíamos? Nos permite escribir:

stringObj.substring(stringObj.length());

y no parece muy seguro ya que stringObj.length () nos devuelve un número entero que es uno más que el último índice.

¿Se hace intencionalmente y esto tiene un propósito? Si es así, ¿cuál es este propósito y cuál es el beneficio que trae?

Respuestas a la pregunta(4)

Su respuesta a la pregunta