0

Por mas que he intentado identificar el error:

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

y no he podido encontrarlo. Mi codigo es :

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class Exercise31 {

    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);

        System.out.print("Enter year: ");
        String year = input.next();

        System.out.print("Enter gender: ");
        String gender = input.next();

        System.out.print("Enter name: ");
        String name = input.next();
        input.close();

        File file = new File("babynameranking" + year + ".txt");
        if (!file.exists()) {
            System.out.println("No record for " + year);
            System.exit(1);
        }

        int rank = 0;
        try {
            Scanner read = new Scanner(file);
            while (read.hasNext()) {

                String s = read.nextLine();
                String[] temp = s.split(" ");

                if (gender.equalsIgnoreCase("M") && temp[1].contains(name))
                    rank = new Integer(temp[0]);
                else if (temp[3].contains(name)) // aqui me marca el error 
                    rank = new Integer(temp[0]);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        if (rank == 0) {
            System.out.println("The name "+name+" is not ranked in year " + year);
        } else {

            System.out.println(name+" is ranked #"+rank+" in year "+ year);
        }


    }
}

babynameranking<AÑO>.txt son diez archivos con el mismo nombre pero con diferente AÑO del 2001 al 2010 en los cuales hay listas de nombres de mujeres y hombres enumerados según el ranking de popularidad en cada AÑO entonces tengo que hacer que cuando yo entre el AÑO , el sexo y el nombre me muestre el numero del ranking.

Ruslan López
  • 10,060
  • 11
  • 35
  • 68
  • Bienvenido, te sugiero leer [ask] para que tu pregunta sea mejor recibida. También, aprovecha y haz el [tour] para entender mejor cómo funcionamos y de paso obtener tu primera [medalla](https://es.stackoverflow.com/help/badges)! Por otro lado no indicas que datos estas usando o que linea especifica es el problema. – Jorgesys Aug 07 '17 at 20:15
  • ¿En cuál línea te marca el error? – Kroneaux Schneider Aug 07 '17 at 20:17
  • Hay varios detalles que son importantes, como el contenido del archivo "babynameranking.txt" que no especificas. – Jorgesys Aug 07 '17 at 20:18

1 Answers1

2

Para que entiendas porque sucede tu error primero un poco de información.

Cuando usas el método split() en java obtienes un array, como ejemplo:

 String s = "John Vieyra Garza Tepes";
 String[] temp = s.split(" ");

En este caso, el array tiene 4 elementos, y puedes obtener sus valores mediante el indice

  • temp[0] contiene el valor John
  • temp[1] contiene el valor Vieyra
  • temp[2] contiene el valor Garza
  • temp[3] contiene el valor Tepes

Que sucede si intentas obtener el elemento del array con indice 3 del siguiente string:

 String s = "John Vieyra";
 String[] temp = s.split(" ");

puedes obtener temp[0] y temp[1] pero el elemento que intentas obtener temp[3] no existe, al tratar de obtenerlo obtendrás el siguiente error:

java.lang.ArrayIndexOutOfBoundsException: 3

Por lo tanto debes asegurar cada linea de tu archivo tenga 4 o más elementos para que no tengas este problema en este punto:

 String s = read.nextLine();
 String[] temp = s.split(" ");

o validar primeramente que no se tenga un valor null en el elemento del array en esta linea de código:

else if (temp[3].contains(name)) // aqui me marca el error 
Jorgesys
  • 103,630
  • 13
  • 52
  • 124