Erro Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException:

Estou aprendendo programação pelo básico ainda, não consegui achar onde errei nesse código, quando executo aparece no final essa mensagem:
Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: Index 4 out of bounds for length 4
at OláMundo.principal.executaAteFim(principal.java:44)
at OláMundo.principal.main(principal.java:21)

//
//
package OláMundo;

public class principal {

//args array de Strings que são passadas
// pra execução do java pelo terminal
// exemplo:
// java Principal arg1 arg2	
public static void main(String[] args) {
	
	//imprimir
	System.out.println(args.length);
	if(args.length == 1) {
		System.out.println("Olá , "+args[0]);
	} else if (args.length == 0){
		System.out.println("Você não passou nenhum argumento.");
		System.out.println("Passe algum argumento");
	} else {
		System.out.println("Mais de um argumento");
	}
	int x = executaAteFim(args);
	System.out.println(x);
	
	imprimeComFor(args);
}

private static void imprimeComFor(String[] args) {
	//Tamanho do array
	// declaração ; condição de parada; incremento
	//  condição de parada indice menor que o tamanho do array
	for (int i = 0; i < args.length; i++) {
		System.out.println(args[i]);
	}
}

private static int executaAteFim(String[] args) {
	int index = 0;
	String nome = "";
	//execute enquanto condição de parada
	//enquanto for diferente de FIM
	while (!nome.equals("FIM")) {
		nome = args [index++];
		System.out.println(nome);
	}
	return index;
}

}

Estás a ler os teus argumentos até encontrar um com o valor "FIM". Se não existir esse valor, vais tentar ler fora do teu array e tens essa Exception.