Friendly reminder: it's not just a choice between C and Java. In order to get bounds checking on arrays it's not necessary to give up the advantages of native programming and use a virtual machine.
Rust is obviously a great example. So is Go. Bounds checked arrays in languages that compile to native is not a new thing.