Compare an array to a street. The street has 10 houses. You then try to go to the 1001st house. Doesn't make sense, does it? It doesn't make sense to the JVM either so it throws an ArrayIndexOutOfBoundsException.
Ah right. I think because that wouldn't be as easy as it seems. The size of the array can change; if I add just one line between these two statements it would become valid all of a sudden:
Or even this:
The compiler cannot keep track of all possible values a variable (including arrays) can have, especially if the value can come from a method call, that perhaps delegates to another method, etc.
During runtime the actual value is known and therefore it is easier to check.
There is no possible way the compiler can know what the size of the returned array will be. Yes, in some trivial cases, it might be able to determine such things, but since it can't all the time, my guess is they said "why bother?"
There are only two hard things in computer science: cache invalidation, naming things, and off-by-one errors