Этот метод бросает исключение IndexOutOfBoundsException, и я не понимаю, почему, поскольку я защитил его.IndexOutOfBoundsException в Java LinkedList
private static boolean firstLoop(int custNo, LinkedList<Pipe> stock, LinkedList<Customer> custs, Random generator, String colour, int col, Tracking tracking) {
if ((stock.get(tracking.getLast(col)) != null) && (stock.get(tracking.getLast(col)).getLength() >= custs.get(custNo).getLength())) {
stock.get(tracking.getLast(col)).length = Cut.cut(stock.get(tracking.getLast(col)).getLength(), custs.get(custNo).getLength(), colour);
if (stock.get(tracking.getLast(col)).length < 5) {
stock.remove(tracking.getLast(col)); //**CAUSES EXCEPTION**
tracking.add();// recycle
}
return true;
} else {
for (int j = tracking.getLast(col) + 1; j < stock.size(); j++) {
if ((stock.get(j).getLength() >= custs.get(custNo).getLength())) {
// pipe is long enough, cut away the desired length
stock.get(j).setLength(Cut.cut(stock.get(j).getLength(), custs.get(custNo).getLength(), colour));
tracking.setLast(col, j);
return true;
}
}
// no suitable pipes available, order new one of correct colour with
// random length 100-200 then cut from it, add to arraylist
Pipe temp2 = new Pipe(col, generator.nextInt(101) + 100);
temp2.setLength(Cut.cut(temp2.length, custs.get(custNo).length, colour));
stock.add(temp2);
tracking.setLast(col, stock.size() - 1);
return false;
}
}
Я обнаружил, что отмеченная строка является той, которая вызывает исключение (программа работает отлично, когда она закомментирована). Однако я смущен, потому что tracking.getLast (col) отлично работает в строках выше него, а функция remove не находится внутри итератора или цикла. Вот класс Наблюдают:
public class Tracking {
static int lastR=0;
static int lastG=0;
static int lastY=0;
public void setLast(int col, int last){
if(col==0){
lastR=last;
}else if(col==1){
lastG=last;
}else if(col==2){
lastY=last;
}else{
System.out.println("Colour does not exist");
}
}
public static int getLast(int col){
if(col==0){
System.out.println(lastR+" red");
return lastR;
}else if(col==1){
System.out.println(lastG+" green");
return lastG;
}else{
System.out.println(lastY+" yellow");
return lastY;
}
}
И это использование метода, который бросает ошибку:
if ((yellowStock.get(Tracking.getLast(2)) != null) && (yellowStock.get(Tracking.getLast(2)).getLength() >= custs.get(i).getLength())) {
firstLoop(i, yellowStock, custs, generator, "yellow", 2, recycle);
}
Исключение в потоке «основной» java.lang.IndexOutOfBoundsException: Индекс: 3, Размер: 3 на java.util.LinkedList.checkElementIndex (Неизвестный источник) на java.util.LinkedList.get (Неизвестный источник) на NextFit.next (NextFit.java:26) на Main.main (Main.java : 58)
Просьба предоставить полную трассировку стека. Это хорошая привычка и, как правило, дает вам гораздо лучшие ответы. Кроме того, если это возможно - попробуйте удалить часть кода, которая не нужна для конкретной проблемы, с которой вы столкнулись – amit
Может ли быть, что Tracking.getLast (col) возвращает индекс, который не существует в объекте запаса? – erikxiv
или, может быть, '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' – amit