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

Em Java, estou usando osubstring() método e não sei por que não está lançando um erro "fora do índice".

A cordaabcde O índice começa de 0 a 4, mas osubstring() O método usa startIndex e endIndex como argumentos, com base no fato de que eu posso chamar foo.substring (0) e obter "abcde".

Então, por que a substring (5) funciona? Esse índice deve estar fora do intervalo. Qual a explicação?

/*
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 gera:

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

Quando substituo 5 por 6:

foo.substring(6)

Então eu recebo o erro:

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

questionAnswers(6)

yourAnswerToTheQuestion