Hola,
Se produce un desbordamiento porque el valor de j no es un acumulador. El valor de j es automáticamente cada uno de los elementos del enumerable, en este caso el array letras. Es decir para cada ciclo, j no tiene un índice dentro del array, sino el elemento del array en esa posición. Por ejemplo,
Código:
char letras [] = {'A',' ','v','e','r','.','.','.','Ñ'};
for ( int j : letras){
System.out.println(j);
}
En el ciclo la variable j toma el valor del primer elemento, por la conversión (cast) implicito que tienes al convertirlo en int, se convierte a integer y te dá el valor de la letra 'A' convertira a integer, o lo que es lo mismo ... su valor en la tabla Unicode UTF-8 (65), y así sucesivamente.
Si solamente quieres imprimir las letras, sin convertirlas a integer tendrías que evitar el cast, y en ese caso va a imprimir las letras una a una,
Código:
char letras [] = {'A',' ','v','e','r','.','.','.','Ñ'};
for (char j : letras){
System.out.println(j);
}
Por cierto, no tienes que confundir la construcción for ( : ) con for ( ; ; ) que son dos cosas completamente diferentes. for (int j = 0; j < letras.length; j++), en este caso tienes el índice del array en j.
Saludos,