Dúvida com if dentro ou fora de repetição

Fazendo uns exercícios, sempre é bom praticar, mesmo simples.
package vetores;
import java.util.Scanner;
public class Exerc26 {
public static void main(String[] args) {
Scanner ler = new Scanner(System.in);
int[] a = new int [10];
int[] b = new int[a.length];
int[] c = new int[a.length];
int i;

for(i = 0;i < a.length;i++) {
	System.out.println("Entre com o valor de A: " + i);
	a[i] = ler.nextInt();	
}	

for(i = 0;i < b.length;i++) {
	System.out.println("Entre com o valor de B: " + i);
	b[i] = ler.nextInt();		

	if (a[i] == b[i]) {
		c[i] = 0;
	}
	else if (a[i] > b[i]){
		c[i] = 1;
	} else {
		c[i] = -1;
	}
	
}	
	
for(i = 0;i < a.length;i++) {
	System.out.println("Valores de a " + a[i] + " ");
	System.out.println("Valores de b " + b[i] + " ");
	System.out.println("Valores de c " + c[i] + " ");
	System.out.println(" ");
}

}
}
Não entendoe porque quando coloco os ifs fora do repetiação do segundo for o java apresenta erro de compilação reclamando do tamanho dos vetores. Qual o motivo?

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:

  1. Verifica se a condição é verdadeira. Se for, vai para o passo 2, senão encerra.
  2. Executa os comandos do corpo
  3. Executa o incremento e volta para o passo 1

No seu caso, ele inicia com i = 0, e durante o loop:

  1. Verifica se i < b.length. Se for, vai para o passo 2, senão encerra
  2. Executa os comandos (ler.nextInt(), etc)
  3. 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).

Tenho de melhorar nas exceções. O java entende que você não leu o if dentro do for, mesmo tendo percorrido todo o vetor, pois a condicional só foi testada somente uma vez. Assim é pego a posição atual de i que é o último valor entrado na repetição. Não é isso?
Obrigado pela ajuda.