Primeiro: por que você quer colocar esses if's fora do for? Tem que ver o que você quer fazer:
- se esta lógica deve ser feita para todos os elementos, então deve estar dentro do
for
- se a lógica só deve ser feita para um elemento, então deve estar fora
Dito isso, por que dá erro se estiver fora do for?
Basicamente, o for tem a seguinte estrutura:
for (inicialização; condição; incremento) {
corpo
}
A inicialização é executada uma vez no início, e depois ele executa os seguintes passos em loop:
- Verifica se a condição é verdadeira. Se for, vai para o passo 2, senão encerra.
- Executa os comandos do corpo
- Executa o incremento e volta para o passo 1
No seu caso, ele inicia com i = 0, e durante o loop:
- Verifica se
i < b.length. Se for, vai para o passo 2, senão encerra
- Executa os comandos (
ler.nextInt(), etc)
- Executa o incremento
i++, e volta para o passo 1
Como b.length é 10 (pois este é o tamanho dos arrays), a condição i < b.length só é falsa quando o valor de i se torna 10 (no caso, o passo 3 faz i se tornar 10, e ao verificar a condição do passo 1, ela se torna falsa e o for se encerra). E quando o for se encerra, o valor de i é 10.
Isso quer dizer que se tivermos o if depois do for, ele tentará acessar a posição 10 dos arrays. Mas como arrays começam do zero (a primeira posição é zero, a segunda é 1, etc), e o tamanho deles é 10, então a última posição é 9, e portanto não existe posição 10.
E ao tentar acessar uma posição que não existe, ocorrerá um erro (será lançado um ArrayIndexOutOfBoundsException).
Então só para ser pedante, não ocorre um erro de compilação (pois o código compila normalmente), e sim um erro de execução (pois ele ocorre quando o código é executado).