【发布时间】:2014-02-16 04:04:16
【问题描述】:
我在我的程序中找不到我的错误,它应该在队列中添加和减去整数,然后打印出每个队列在 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();
}
}
堆栈跟踪:
线程“主”java.lang.IndexOutOfBoundsException 中的异常:索引:0,大小:0
在 java.util.ArrayList.rangeCheck(未知来源)
在 java.util.ArrayList.get(未知来源)
在 AirportQueue.airportSimulation(AirportQueue.java:93)
在 AirportQueue.main(AirportQueue.java:134)
有问题的行:
int max1 = q1.get(0);
【问题讨论】:
-
你是怎么运行的
-
如果您告诉我们越界异常是从哪一行引发的,这将有所帮助。
-
这个逻辑显然有缺陷 -
int q1Total = 0; avgQ1 = (q1Total + q1.get(k))/500;提示(每个 avgQ1 = 最后一个元素/500)。 -
我添加了stacktrace,问题是这个语句:
int max1 = q1.get(0);,这意味着q1的大小是0。 -
@lchristina26 遵循 Polywhirl 先生所写的内容,这意味着在通过循环时,它从未遇到过
q1.add()调用,这是可以理解的,因为它可能有其他 4 条路径通过第一系列的if块。 (事实上,如果i是奇数,它甚至根本不会通过 if 块。所以当i为 1 并且在之前的i==0上没有向q1添加任何内容时会发生什么情况@ 传递循环?
标签: java arraylist queue indexoutofboundsexception