ArrayList IndexOutOfBoundsException JAVA

ArrayList IndexOutOfBoundsException JAVA

当我尝试 运行 程序时出现这些错误,

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.rangeCheck(ArrayList.java:635)
at java.util.ArrayList.get(ArrayList.java:411)
at casino.Casino.actualizarListaEspera(Casino.java:35)
at casino.Casino.llegaJugador(Casino.java:49)
at casino.Controlador.llegaJugador(Controlador.java:26)
at casino.Controlador.simular(Controlador.java:17)
at casino.Simulador.siguienteIteracion(Simulador.java:43)
at casino.Simulador.simular(Simulador.java:37)
at casino.Simulador.main(Simulador.java:28)

问题出在 casino.Casino.actualizarListaEspera(Casino.java:35),但我不知道我做错了什么。在前面 class 我已经完成 miCasino = new Casino(nMesas); 来初始化该对象,所以我相信 listaEspera = new ArrayList<>(); 会初始化 ArrayList。

package casino;

import java.util.ArrayList;


public class Casino {                                   //Constructor del    objeto casino
public int numMesas;                                //Numero total de mesas que tiene el casino
public int totalGanadoJugadores;                    //Cantidad total ganada por los jugadores
public int totalGanadoCasino;                       //Cantidad total ganada por el casino
public int totalJugadores;                          //Numero total de jugadores que han pasado por el casino (habiendo jugado)
public int totalEsperado;                           //Tiempo total esperado por los jugadores del casino
public int totalJugado;                             //Tiempo total jugado 
public ArrayList<Mesa>  misMesas;                   //Lista de mesas que tiene el casino
public ArrayList<Persona> listaEspera;              //Cola de espera para entrar a jugar

public Casino(int nMesas){
    this.numMesas = nMesas;                         //Inicializamos el numero de mesas al dado por el usuario
    this.totalGanadoJugadores = 0;                  //Inicializamos la cantidad total ganada por los jugadores a 0
    this.totalGanadoCasino = 0;                     //Inicializamos la cantidad total ganada por el casino a 0
    this.totalJugadores = 0;                        //Inicializamos el numero total de jugadores que han visitado el casino a 0
    this.totalEsperado = 0;                         //Inicializamos el tiempo total esperado por los jugadores a 0
    this.totalJugado = 0;                           //Inicializamos el tiempo total jugado a 0
    misMesas = new ArrayList<>();                   //Creamos la lista de mesas
    listaEspera = new ArrayList<>();                //Creamos la lita de espera
    for(int i=0;i<nMesas;i++){                      //Recorremos la lista de mesas
      Mesa nuevaMesa = new Mesa();                  //Construimos una nueva mesa
      this.misMesas.add(nuevaMesa);                 //Añadimos la mesa a la lista
    }
}

public void actualizarListaEspera(Reloj reloj){
    if (!this.listaEspera.isEmpty()){               //Si hay alguien en la lista de espera...
        for(int i=0;i<this.numMesas;i++){           //Recorremos todas las mesas del casino
            if(this.misMesas.get(i).nJugadores<5){  //Si hay alguna silla vacia en esa mesa...
                this.misMesas.get(i).sentarJugador(this.listaEspera.get(0));    //Sentamos al jugador que mas lleva esperando
                this.totalJugadores++;              //Incrementamos el numero de jugadores que han pasado por el casino
                this.listaEspera.get(0).tiempoEmpieza = reloj.getTiempo();  //Establecemos el tiempo en el que se sienta el jugador al momento actual
                this.totalEsperado = this.totalEsperado + (this.listaEspera.get(0).tiempoEmpieza - this.listaEspera.get(0).tiempoEntrada);  //Sumamos el tiempo que ha estado esperando el jugador al tiempo de espera total
                this.listaEspera.remove(0);         //Lo quitamos de la lista de espera
            }
        }
    }
}

public void llegaJugador(Reloj reloj){              //Funcion: llega un jugador al casino       
    Persona nuevoJugador = new Persona();           //Creamos el nuevo jugador
    nuevoJugador.tiempoEntrada = reloj.getTiempo(); //Establecemos el momento de entrada al casino del jugador al momento actual
    this.listaEspera.add(nuevoJugador);             //Introducimos el nuevo jugador en la cola de espera
    actualizarListaEspera(reloj);                   //Actualizamos la lista de espera
}

public void jugarPartidas(Reloj reloj){             //Funcion: jugar partida
    for(int i=0;i<this.numMesas;i++){               //Recorremos todas las mesas
        if(this.misMesas.get(i).nJugadores>0){      //Si hay jugadores en esa mesa
            this.misMesas.get(i).jugarPartida(reloj);    //Hacemos que en esa mesa se juegue la partida
        }
    }
}

public void actualizarCasino(){                     //Funcion: actualizar casino
    for(int i=0;i<this.numMesas;i++){               //Recorremos todas las mesas
        this.totalGanadoJugadores = this.totalGanadoJugadores + this.misMesas.get(i).totalJugado - this.misMesas.get(i).totalGanadoBanca;   //Actualizamos la cantidad total ganada por los jugadores
        this.totalGanadoCasino = this.totalGanadoCasino + this.misMesas.get(i).totalGanadoBanca;    //Actualizamos la cantidad total ganada por el casino
        this.totalJugado = this.totalJugado + this.misMesas.get(i).tiempoTotalJugado;   //Actualizamos el tiempo total jugado
    }
}
}

在此代码中

if (!this.listaEspera.isEmpty()){               //Si hay alguien en la lista de espera...
    for(int i=0;i<this.numMesas;i++){           //Recorremos todas las mesas del casino
        if(this.misMesas.get(i).nJugadores<5){  //Si hay alguna silla vacia en esa mesa...
            this.misMesas.get(i).sentarJugador(this.listaEspera.get(0));    //Sentamos al jugador que mas lleva esperando
            this.totalJugadores++;              //Incrementamos el numero de jugadores que han pasado por el casino
            this.listaEspera.get(0).tiempoEmpieza = reloj.getTiempo();  //Establecemos el tiempo en el que se sienta el jugador al momento actual
            this.totalEsperado = this.totalEsperado + (this.listaEspera.get(0).tiempoEmpieza - this.listaEspera.get(0).tiempoEntrada);  //Sumamos el tiempo que ha estado esperando el jugador al tiempo de espera total
            this.listaEspera.remove(0);         //Lo quitamos de la lista de espera
        }
    }
}

您确保 listaEspera 中至少有 1 个元素,但是您没有检查是否有足够的元素,因此当您继续删除不会 运行 的元素时。

我建议您在调试器中单步执行此代码,以便了解出现此错误的原因。