2012-05-05 13 views
-1

Этот метод бросает исключение 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)

+0

Просьба предоставить полную трассировку стека. Это хорошая привычка и, как правило, дает вам гораздо лучшие ответы. Кроме того, если это возможно - попробуйте удалить часть кода, которая не нужна для конкретной проблемы, с которой вы столкнулись – amit

+0

Может ли быть, что Tracking.getLast (col) возвращает индекс, который не существует в объекте запаса? – erikxiv

+0

или, может быть, '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' – amit

ответ

0

Проблема заключается в следующем:

LinkedList.remove() поставляется в двух вариантах:

  1. LinkedList.remove(int index), который удаляет элемент по указанному индексу
  2. LinkedList.remove(Object o), который удаляет предписанных в технических заданиях элемент

Кроме того, tracking.getLast(int col) возвращает int, поэтому при звонке

stock.remove(tracking.getLast(col)); 

версия remove(), которая называется номер 1, а не номер 2, как вы хотели.

Попробуйте позвонить stock.remove(col); или что-то еще имеет смысл.

В качестве альтернативы ваш стиль кодирования может использовать некоторое улучшение, особенно использование статических полей и методов в Tracking вместо экземпляра полей и методов.

+0

Спасибо, я посмотрю в этом направлении –