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

En Java estoy usando elsubstring() método y no estoy seguro de por qué no arroja un error "fuera de índice".

La cuerdaabcde tiene un índice de inicio de 0 a 4, pero elsubstring() El método toma startIndex y endIndex como argumentos basados en el hecho de que puedo llamar a foo.substring (0) y obtener "abcde".

Entonces, ¿por qué funciona la subcadena (5)? Ese índice debe estar fuera de rango. ¿Cuál es la explicación?

/*
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));

Este código genera:

abcde
bcde
cde
de
e
     //foo.substring(5) output nothing here, isn't this out of range?

Cuando reemplazo 5 con 6:

foo.substring(6)

Entonces me sale un error:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException:
    String index out of range: -1

Respuestas a la pregunta(6)

Su respuesta a la pregunta