Java 使用ArrayList的代码中出现越界异常错误

Java 使用ArrayList的代码中出现越界异常错误,java,arraylist,queue,indexoutofboundsexception,Java,Arraylist,Queue,Indexoutofboundsexception,我在我的程序中找不到我的错误,该程序应该向队列中添加和减去整数,然后在500分钟内打印出每个队列的平均值和最大值。我不断遇到越界异常错误,但无法解决问题。如果您能帮我确定问题所在,我们将不胜感激 import java.util.*; import java.util.Random; import java.util.LinkedList; import java.util.ArrayList; public class AirportQueue { public static int

我在我的程序中找不到我的错误,该程序应该向队列中添加和减去整数,然后在500分钟内打印出每个队列的平均值和最大值。我不断遇到越界异常错误,但无法解决问题。如果您能帮我确定问题所在,我们将不胜感激

import java.util.*;
import java.util.Random;
import java.util.LinkedList;
import java.util.ArrayList;

public class AirportQueue {
    public static int longestWaitTime = 0;
    public static Random rand = new Random(3);
    public static int partySize;
    public static Random randQueue = new Random(2);
    public static Queue<Integer> airportQ1 = new LinkedList<>();
    public static Queue<Integer> airportQ2 = new LinkedList<>();
    public static Queue<Integer> airportQ3 = new LinkedList<>();
    public static ArrayList[] minute = new ArrayList[500];
    public static ArrayList[] secondMinute = new ArrayList[250];
    public static ArrayList<Integer> q1 = new ArrayList(0);
    public static ArrayList<Integer> q2 = new ArrayList(0);
    public static ArrayList<Integer> q3 = new ArrayList(0);
    public static int avgQ1 = 0;
    public static int avgQ2 = 0;
    public static int avgQ3 = 0;

    public void airportSimulation() {

        for (int i = 0; i < 500; i++) {
            if ((i % 2) == 0) { // add a party to a queue each minute
                if ((airportQ1.size() < airportQ2.size()) && (airportQ1.size() < airportQ3.size())) {
                    partySize = rand.nextInt();
                    airportQ1.add(partySize);
                    q1.add(partySize);
                } else if ((airportQ2.size() < airportQ1.size()) && (airportQ2.size() < airportQ3.size())) {
                    partySize = rand.nextInt();
                    airportQ2.add(partySize);
                    q2.add(partySize);
                } else {
                    partySize = rand.nextInt();
                    airportQ3.add(partySize);
                    q3.add(partySize);
                }
                int queueSelected = randQueue.nextInt();
                if (queueSelected == 0) {
                    if (airportQ1.isEmpty()) {
                        System.out.println("The first queue is empty.");
                    } else {
                        airportQ1.remove();
                    }
                } else if (queueSelected == 1) { // remove a party every 2 minutes
                    if (airportQ2.isEmpty()) {
                        System.out.println("The second queue is empty.");
                    } else {
                        airportQ2.remove();
                    }
                } else {
                    if (airportQ3.isEmpty()) {
                        System.out.println("The third queue is empty.");
                    } else {
                        airportQ3.remove();
                    }
                }

            } else {
                if ((airportQ1.size() < airportQ2.size()) && (airportQ1.size() < airportQ3.size())) {
                    partySize = rand.nextInt();
                    airportQ1.add(partySize);
                    q1.add(partySize);
                } else if ((airportQ2.size() < airportQ1.size()) && (airportQ2.size() < airportQ3.size())) {
                    partySize = rand.nextInt();
                    airportQ2.add(partySize);
                    q2.add(partySize);
                } else {
                    partySize = rand.nextInt();
                    airportQ3.add(partySize);
                    q3.add(partySize);
                }
            }
        }

        // num of people in queue
        for (int k = 0; k < airportQ1.size(); k++) {
            int q1Total = 0;
            avgQ1 = (q1Total + q1.get(k)) / 500;
        }
        for (int k = 0; k < airportQ2.size(); k++) {
            int q1Total = 0;
            avgQ2 = (q1Total + q2.get(k)) / 500;
        }
        for (int k = 0; k < airportQ3.size(); k++) {
            int q1Total = 0;
            avgQ3 = (q1Total + q3.get(k)) / 500;
        }

        // Max value for each queue
        int max1 = q1.get(0);
        for (int i = 0; i < q1.size(); i++) {
            int current1 = q1.get(i);
            if (current1 > max1) {
                max1 = current1;
            }
        }

        int max2 = q2.get(0);
        for (int i = 0; i < q2.size(); i++) {
            int current2 = q2.get(i);
            if (current2 > max2) {
                max2 = current2;
            }
        }

        int max3 = q3.get(0);
        for (int i = 0; i < q3.size(); i++) {
            int current3 = q3.get(i);
            if (current3 > max3) {
                max3 = current3;
            }
        }

        System.out.println("The average number of people in the first "
                + "Airport Security queue is " + avgQ1);
        System.out.println("The average number of people in the second "
                + "Airport Security queue is " + avgQ2);
        System.out.println("The average number of people in the third "
                + "Airport Security queue is " + avgQ3);
        System.out.println("The maximum number of people in the first "
                + "queue at any given time was " + max1);
        System.out.println("The maximum number of people in the first "
                + "queue at any given time was " + max2);
        System.out.println("The maximum number of people in the first "
                + "queue at any given time was " + max3);

    }

    public static void main(String[] args) {
        AirportQueue testAirport = new AirportQueue();
        testAirport.airportSimulation();
    }
}

解决了问题,谢谢大家的帮助!下面是正确的代码,该代码对于分配给它的类来说已经足够好了

import java.util.Random;
import java.util.LinkedList;
import java.util.ArrayList;

public class AirportQueue {

public Random rand = new Random();
public int partySize;
public Random randQueue = new Random();
public LinkedList<Integer> airportQ1 = new LinkedList<>();
public LinkedList<Integer> airportQ2 = new LinkedList<>();
public LinkedList<Integer> airportQ3 = new LinkedList<>();
public ArrayList[] minute = new ArrayList[500];
public ArrayList[] secondMinute = new ArrayList[250];
public ArrayList<Integer> q1 = new ArrayList(0);
public ArrayList<Integer> q2 = new ArrayList(0);
public ArrayList<Integer> q3 = new ArrayList(0);
public int avgQ1 = 0;
public int avgQ2 = 0;
public int avgQ3 = 0;
public int max1 = 0;
public int max2 = 0;
public int max3 = 0;
public int countQ1 = 0;
public int countQ2 = 0;
public int countQ3 = 0;

public void airportSimulation() {

    int queueSelected = randQueue.nextInt(3);

    //Simulate queues for 500 minutes
    for (int i = 1; i < 501; i++) {
        //add a party to a queue each minute
        if ((i % 2) == 0) {
            if ((airportQ1.size() <= airportQ2.size()) && (airportQ1.size() <= airportQ3.size())) {
                partySize = rand.nextInt(4) + 1;
                airportQ1.add(partySize);
                q1.add(partySize);
                System.out.println("Minute " + i + ": a party of " + partySize + " just entered the queue.");
            } else if ((airportQ2.size() <= airportQ1.size()) && (airportQ2.size() <= airportQ3.size())) {
                partySize = rand.nextInt(4) + 1;
                airportQ2.add(partySize);
                q2.add(partySize);
                System.out.println("Minute " + i + ": a party of " + partySize + " just entered the queue.");
            } else//((airportQ3.size() <= airportQ1.size()) && (airportQ3.size() <= airportQ2.size())) 
            {
                partySize = rand.nextInt(4) + 1;
                airportQ3.add(partySize);
                q3.add(partySize);
                System.out.println("Minute " + i + ": a party of " + partySize + " just entered the queue.");
            }

            //remove a party every 2 minutes
            if (queueSelected == 0) {
                if (airportQ1.size() != 0) {
                    airportQ1.remove();
                    if (airportQ1.size() > 0) {
                        System.out.println("Minute " + i + ": a party of " + airportQ1.get(airportQ1.size() - 1) + " just passed security.");
                    }
                }
            } else if (queueSelected == 1) {
                if (airportQ2.size() != 0) {
                    airportQ2.remove();
                    if (airportQ2.size() > 0) {
                        System.out.println("Minute " + i + ": a party of " + airportQ2.get(airportQ2.size() - 1) + " just passed security.");
                    }
                }
            } else {
                if (airportQ3.size() != 0) {
                    airportQ3.remove();
                    if (airportQ3.size() > 0) {
                        System.out.println("Minute " + i + ": a party of " + airportQ3.get(airportQ3.size() - 1) + " just passed security.");
                    }
                }
            }
            queueSelected = randQueue.nextInt(3);

        } else {
            if ((airportQ1.size() <= airportQ2.size()) && (airportQ1.size() <= airportQ3.size())) {
                partySize = rand.nextInt(4) + 1;
                airportQ1.add(partySize);
                q1.add(partySize);
                System.out.println("Minute " + i + ": a party of " + partySize + " just entered the queue.");
            } else if ((airportQ2.size() <= airportQ1.size()) && (airportQ2.size() <= airportQ3.size())) {
                partySize = rand.nextInt(4) + 1;
                airportQ2.add(partySize);
                q2.add(partySize);
                System.out.println("Minute " + i + ": a party of " + partySize + " just entered the queue.");
            } else {
                partySize = rand.nextInt(4) + 1;
                airportQ3.add(partySize);
                q3.add(partySize);
                System.out.println("Minute " + i + ": a party of " + partySize + " just entered the queue.");
            }
        }

        //num of people in queue
        int q1Total = 0;
        for (int k = (airportQ1.size() - 1); k > 0; k--) {
            q1Total = q1Total + airportQ1.get(k);
            avgQ1 = q1Total / 500;
            q1.add(q1Total);
        }
        int q2Total = 0;
        for (int k = 1; k < airportQ2.size(); k++) {
            q2Total = q2Total + q1.get(k);
            q2.add(q2Total);
        }
        int q3Total = 0;
        for (int k = 1; k < airportQ3.size(); k++) {
            q3Total = q3Total + airportQ3.get(k);
            q3.add(q3Total);
        }
    }

    //avg number of people in each queue
    for (int m = 1; m < q1.size(); m++) {
        countQ1 = q1.get(m) + countQ1;
    }
    for (int m = 1; m < q2.size(); m++) {
        countQ2 = q2.get(m) + countQ2;
    }
    for (int m = 1; m < q3.size(); m++) {
        countQ3 = q3.get(m) + countQ3;
    }
    avgQ1 = countQ1 / (q1.size() - 1);
    avgQ2 = countQ2 / (q2.size() - 1);
    avgQ3 = countQ3 / (q3.size() - 1);

    //Max value for each queue
    for (int j = 0; j < q1.size(); j++) {
        int current1 = q1.get(j);
        if (current1 > max1) {
            max1 = current1;
        }
    }
    for (int i = 0; i < q2.size(); i++) {
        int current2 = q2.get(i);
        if (current2 > max2) {
            max2 = current2;
        }
    }
    for (int i = 0; i < q3.size(); i++) {
        int current3 = q3.get(i);
        if (current3 > max3) {
            max3 = current3;
        }
    }

    System.out.println("The average number of people in the first "
            + "Airport Security queue is " + avgQ1);
    System.out.println("The average number of people in the second "
            + "Airport Security queue is " + avgQ2);
    System.out.println("The average number of people in the third "
            + "Airport Security queue is " + avgQ3);
    System.out.println("The maximum number of people in the first "
            + "queue at any given time was " + max1);
    System.out.println("The maximum number of people in the second "
            + "queue at any given time was " + max2);
    System.out.println("The maximum number of people in the third "
            + "queue at any given time was " + max3);

}

public static void main(String[] args) {
    AirportQueue testAirport = new AirportQueue();
    testAirport.airportSimulation();
}
}
import java.util.Random;
导入java.util.LinkedList;
导入java.util.ArrayList;
公共类机场队列{
公共随机兰德=新随机();
公众参与;
public Random randQueue=new Random();
public LinkedList airportQ1=新建LinkedList();
public LinkedList airportQ2=新建LinkedList();
public LinkedList airportQ3=新建LinkedList();
公共ArrayList[]分钟=新ArrayList[500];
public ArrayList[]secondMinute=新建ArrayList[250];
公共ArrayList q1=新ArrayList(0);
公共ArrayList q2=新ArrayList(0);
公共ArrayList q3=新ArrayList(0);
公共int avgQ1=0;
公共int avgQ2=0;
公共int avgQ3=0;
公共整数max1=0;
公共整数max2=0;
公共整数max3=0;
公共整数countQ1=0;
公共整数countQ2=0;
公共整数countQ3=0;
公共void机场模拟(){
int queueSelected=randQueue.nextInt(3);
//模拟500分钟的排队
对于(int i=1;i<501;i++){
//每分钟向队列中添加一方
如果((i%2)==0){

if((airportQ1.size())以及您是如何运行的如果您告诉我们从哪一行抛出越界异常将有所帮助。此逻辑显然有缺陷-
int q1Total=0;avgQ1=(q1Total+q1.get(k))/500;
提示(每个avgQ1=最后一个元素/500)。我添加了stacktrace,问题是这样的语句:
int max1=q1.get(0);
这意味着
q1
的大小是
0
@lchristina26,这意味着在经过循环时,它从未碰到
q1.add()
调用,这是可以理解的,因为它可以通过第一系列
if
块使用4条其他路径。(事实上,如果
i
是奇数,它甚至不会通过if块。那么当
i
为1,并且在上一次
i==0
通过循环时没有向
q1
添加任何内容时会发生什么?
import java.util.Random;
import java.util.LinkedList;
import java.util.ArrayList;

public class AirportQueue {

public Random rand = new Random();
public int partySize;
public Random randQueue = new Random();
public LinkedList<Integer> airportQ1 = new LinkedList<>();
public LinkedList<Integer> airportQ2 = new LinkedList<>();
public LinkedList<Integer> airportQ3 = new LinkedList<>();
public ArrayList[] minute = new ArrayList[500];
public ArrayList[] secondMinute = new ArrayList[250];
public ArrayList<Integer> q1 = new ArrayList(0);
public ArrayList<Integer> q2 = new ArrayList(0);
public ArrayList<Integer> q3 = new ArrayList(0);
public int avgQ1 = 0;
public int avgQ2 = 0;
public int avgQ3 = 0;
public int max1 = 0;
public int max2 = 0;
public int max3 = 0;
public int countQ1 = 0;
public int countQ2 = 0;
public int countQ3 = 0;

public void airportSimulation() {

    int queueSelected = randQueue.nextInt(3);

    //Simulate queues for 500 minutes
    for (int i = 1; i < 501; i++) {
        //add a party to a queue each minute
        if ((i % 2) == 0) {
            if ((airportQ1.size() <= airportQ2.size()) && (airportQ1.size() <= airportQ3.size())) {
                partySize = rand.nextInt(4) + 1;
                airportQ1.add(partySize);
                q1.add(partySize);
                System.out.println("Minute " + i + ": a party of " + partySize + " just entered the queue.");
            } else if ((airportQ2.size() <= airportQ1.size()) && (airportQ2.size() <= airportQ3.size())) {
                partySize = rand.nextInt(4) + 1;
                airportQ2.add(partySize);
                q2.add(partySize);
                System.out.println("Minute " + i + ": a party of " + partySize + " just entered the queue.");
            } else//((airportQ3.size() <= airportQ1.size()) && (airportQ3.size() <= airportQ2.size())) 
            {
                partySize = rand.nextInt(4) + 1;
                airportQ3.add(partySize);
                q3.add(partySize);
                System.out.println("Minute " + i + ": a party of " + partySize + " just entered the queue.");
            }

            //remove a party every 2 minutes
            if (queueSelected == 0) {
                if (airportQ1.size() != 0) {
                    airportQ1.remove();
                    if (airportQ1.size() > 0) {
                        System.out.println("Minute " + i + ": a party of " + airportQ1.get(airportQ1.size() - 1) + " just passed security.");
                    }
                }
            } else if (queueSelected == 1) {
                if (airportQ2.size() != 0) {
                    airportQ2.remove();
                    if (airportQ2.size() > 0) {
                        System.out.println("Minute " + i + ": a party of " + airportQ2.get(airportQ2.size() - 1) + " just passed security.");
                    }
                }
            } else {
                if (airportQ3.size() != 0) {
                    airportQ3.remove();
                    if (airportQ3.size() > 0) {
                        System.out.println("Minute " + i + ": a party of " + airportQ3.get(airportQ3.size() - 1) + " just passed security.");
                    }
                }
            }
            queueSelected = randQueue.nextInt(3);

        } else {
            if ((airportQ1.size() <= airportQ2.size()) && (airportQ1.size() <= airportQ3.size())) {
                partySize = rand.nextInt(4) + 1;
                airportQ1.add(partySize);
                q1.add(partySize);
                System.out.println("Minute " + i + ": a party of " + partySize + " just entered the queue.");
            } else if ((airportQ2.size() <= airportQ1.size()) && (airportQ2.size() <= airportQ3.size())) {
                partySize = rand.nextInt(4) + 1;
                airportQ2.add(partySize);
                q2.add(partySize);
                System.out.println("Minute " + i + ": a party of " + partySize + " just entered the queue.");
            } else {
                partySize = rand.nextInt(4) + 1;
                airportQ3.add(partySize);
                q3.add(partySize);
                System.out.println("Minute " + i + ": a party of " + partySize + " just entered the queue.");
            }
        }

        //num of people in queue
        int q1Total = 0;
        for (int k = (airportQ1.size() - 1); k > 0; k--) {
            q1Total = q1Total + airportQ1.get(k);
            avgQ1 = q1Total / 500;
            q1.add(q1Total);
        }
        int q2Total = 0;
        for (int k = 1; k < airportQ2.size(); k++) {
            q2Total = q2Total + q1.get(k);
            q2.add(q2Total);
        }
        int q3Total = 0;
        for (int k = 1; k < airportQ3.size(); k++) {
            q3Total = q3Total + airportQ3.get(k);
            q3.add(q3Total);
        }
    }

    //avg number of people in each queue
    for (int m = 1; m < q1.size(); m++) {
        countQ1 = q1.get(m) + countQ1;
    }
    for (int m = 1; m < q2.size(); m++) {
        countQ2 = q2.get(m) + countQ2;
    }
    for (int m = 1; m < q3.size(); m++) {
        countQ3 = q3.get(m) + countQ3;
    }
    avgQ1 = countQ1 / (q1.size() - 1);
    avgQ2 = countQ2 / (q2.size() - 1);
    avgQ3 = countQ3 / (q3.size() - 1);

    //Max value for each queue
    for (int j = 0; j < q1.size(); j++) {
        int current1 = q1.get(j);
        if (current1 > max1) {
            max1 = current1;
        }
    }
    for (int i = 0; i < q2.size(); i++) {
        int current2 = q2.get(i);
        if (current2 > max2) {
            max2 = current2;
        }
    }
    for (int i = 0; i < q3.size(); i++) {
        int current3 = q3.get(i);
        if (current3 > max3) {
            max3 = current3;
        }
    }

    System.out.println("The average number of people in the first "
            + "Airport Security queue is " + avgQ1);
    System.out.println("The average number of people in the second "
            + "Airport Security queue is " + avgQ2);
    System.out.println("The average number of people in the third "
            + "Airport Security queue is " + avgQ3);
    System.out.println("The maximum number of people in the first "
            + "queue at any given time was " + max1);
    System.out.println("The maximum number of people in the second "
            + "queue at any given time was " + max2);
    System.out.println("The maximum number of people in the third "
            + "queue at any given time was " + max3);

}

public static void main(String[] args) {
    AirportQueue testAirport = new AirportQueue();
    testAirport.airportSimulation();
}
}