2014-10-19 4 views
-4

Я смотрел на него в течение одного часа, и я не могу понять, почему он продолжает говорить мне ту же ошибку. Для тех, кто задается вопросом, что моя программа, в основном она читает текстовый файл, который содержит штрих-коды, имя и цену. Затем я прочитаю другой текстовый файл, который содержит только штрих-коды, и напечатает соответствующее имя и цену. К сожалению, он печатает только одну строку, а затем показывает эту ошибку: -Почему моя программа показывает эту ошибку?

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 99, Size: 99 
    at java.util.ArrayList.rangeCheck(ArrayList.java:635) 
    at java.util.ArrayList.get(ArrayList.java:411) 
    at javaapplication9.JavaApplication9.Search(JavaApplication9.java:66) 
    at javaapplication9.JavaApplication9.main(JavaApplication9.java:85) 

главный

public class JavaApplication9 
{ 
    long value1; 
    String value2; 
    double value3; 
    ArrayList<String> toBeSplit = new ArrayList(); 
    String[] split; 
    ArrayList <Inventory> productList = new ArrayList<>(); 
    ArrayList <Long> barcodes = new ArrayList(); 

    public long ReadFile(String sfile) throws IOException 
      {  
       int x = 0; 
       File inFile = new File(sfile); 
       BufferedReader reader = new BufferedReader(new FileReader(inFile)); 
       String sline = null; 
       while ((sline=reader.readLine()) != null) 
        { 
         toBeSplit.add(x,sline); 
         x++; 
        } 
       reader.close(); 
       return inFile.length(); 
      } 

    public void splitString() 
    { 
     int a = 0; 
     while (a<toBeSplit.size()) 
     { 
      split = toBeSplit.get(a).split(",");    
      value1 = Long.parseLong(split[0]); 
      value2 = split[1]; 
      value3 = Double.parseDouble(split[2]); 
      productList.add(new Inventory (value1,value2,value3,split[0])); 
      a++; 
     } 
    } 

    public long readBarcodes (String file) throws IOException 
      {  
       File text = new File(file); 
       int x = 0; 
       BufferedReader reader = new BufferedReader(new FileReader(text)); 
       String line = null; 
       while ((line=reader.readLine()) != null) 
        { 
         long barcod = Long.parseLong (line); 
         barcodes.add(x,barcod); 
         x++; 
        } 
       reader.close(); 
       return text.length(); 
      } 

    public void Search() 
    { 
     int size = barcodes.size(); 
     int counter = 0; 
     for (Inventory e : productList) 
      { 
       if ((e.getBarcode() - barcodes.get(counter) == 0) && counter <= size) 
       { 
        System.out.println (e.getRBarcode()+ "\t" + e.getName() + "\t"+ e.getPrice()); 
       } 
       else 
       { 
        counter++; 
       } 
      } 
    } 

    public static void main(String[] args) 
    { 
     try 
     { 
      JavaApplication9 instance = new JavaApplication9(); 
      instance.ReadFile("Products (1).csv"); 
      instance.splitString(); 
      instance.readBarcodes("Items.txt"); 
      instance.Search(); 

     } 
     catch (IOException e) 
     { 
      System.out.print ("Error"); 
     } 
    } 
} 

инвентарь класс

public class Inventory 
{ 
    long barcode; 
    String name,realBar; 
    double price; 

    public Inventory (long bars,String pname,double prices,String realBarcode) 
    { 
     barcode = bars; 
     name = pname; 
     price = prices; 
     realBar = realBarcode; 
    } 

    public long getBarcode() 
    { 
     return barcode; 
    } 

    public String getName() 
    { 
     return name; 
    } 

    public String getRBarcode() 
    { 
     return realBar; 
    } 

    public double getPrice() 
    { 
     return price; 
    } 
} 
+2

выглядит как 'Off-на-One' ошибка –

+0

сообщение об ошибке на самом деле говорит вам все детали, необходимые, чтобы найти точное местоположение проблемы , Программа пытается получить доступ к элементу один за последним, и это происходит в строке 66 в файле 'JavaApplication9.java' – Henry

ответ

0

От ошибки, мы видим, что вы пытаетесь доступ к индексу 99 из Arraylist только с 99 элементов. Помните, что индекс начинается 0, так что вы можете получить только до 98, прежде чем вы «вне границ» (который даст вам IndexOutOfBoundsException вы видели выше.)

IndexOutOfBoundsException говорит нам, что эта линия является виновником :

if ((e.getBarcode() - barcodes.get(counter) == 0) && counter <= size) 

counter начинается в 0 это хорошо, но вы позволяете counter, чтобы добраться до size который 99, потому что нет ничего ограничивающего его. Как только counter достигает 99, вы пытаетесь сделать barcodes.get(counter), который, конечно же, даст вам IndexOutOfBoundsException, потому что 99 находится за пределами поля barcodes.

Попробуйте добавить превентивный Условный оператор внутри для цикла, прежде чем все остальное, чтобы break, когда счетчик становится слишком высоким:

for (Inventory e : productList) 
{ 
    if (counter == size) 
     break; 
    if ((e.getBarcode() - barcodes.get(counter) == 0) && counter <= size) 
    { 
     System.out.println (e.getRBarcode()+ "\t" + e.getName() + "\t"+ e.getPrice()); 
    } 
    else 
    { 
     counter++; 
    } 
} 

Другим решением было бы изменить свой Условный оператор. Если изменить <= к <, а затем изменить порядок, в котором оцениваются заявления, вы можете предотвратить это исключение:

if (counter < size && (e.getBarcode() - barcodes.get(counter) == 0)) 

В этом случае, когда счетчик достигает 99, он будет оценивать ложен на counter < size, и из-за двойного амперсанда (&&), вторая половина оператора if не будет оценена, поэтому он будет продолжать команду else.

Дайте мне знать, если это сработает для вас.

+1

Или просто измените' counter <= size' на 'counter csmckelvey

+0

@Takendarkk Я не думаю это будет работать, потому что если счетчик достигнет 99, первый if-statement вернет false, поэтому он перейдет к else, который просто добавит 1 к счетчику. Как только цикл продолжится снова, он попытается снова выполнить barcodes.get (counter) внутри if-statement и снова выбросит исключение. Вам также придется переставить if-инструкцию для этого изменения для работы. Я отредактировал свой ответ, чтобы включить это решение. –

0

Здесь, когда вы указали barcodes.size(), вы получите фактический размер.

Теперь counter равен нуль на основе и внутри for цикла вы делаете barcodes.get(counter), который на самом деле идет до barcodes размера + 1. Кроме того, counter <= size вида пусть это поражало это значение.

Таким образом, все, что вам нужно сделать, это изменить здесь

if ((e.getBarcode() - barcodes.get(counter) == 0) && counter <= size)

в

if (counter < size && (e.getBarcode() - barcodes.get(counter) == 0))

0

В вашем методе Searchbarcodes.size() дает фактический размер ArrayList. Но ваш счетчик начинается с 0. Следовательно, попробуйте изменить

if ((e.getBarcode() - barcodes.get(counter) == 0) && counter <= size) 

к:

if ((counter < size) && (e.getBarcode() - barcodes.get(counter) == 0)) 
+0

Вам также придется переключать порядок двух оценок, иначе сначала будет оценен barcodes.get (counter). Если счетчик равен 99, сначала должен выполняться оператор if (e.getBarcode() - barcodes.get (counter) == 0), который включает в себя barcodes.get (counter), и это приведет к исключению Exception, так что другая половина if-statement никогда не будет оценен и бесполезен. При переключении их порядка это исправляется. –

Смежные вопросы