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 个元素,但是您没有检查是否有足够的元素,因此当您继续删除不会 运行 的元素时。
我建议您在调试器中单步执行此代码,以便了解出现此错误的原因。
当我尝试 运行 程序时出现这些错误,
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 个元素,但是您没有检查是否有足够的元素,因此当您继续删除不会 运行 的元素时。
我建议您在调试器中单步执行此代码,以便了解出现此错误的原因。