为什么我的程序显示此错误?

时间:2014-10-19 06:14:30

标签: java arrays

我一直在看它一个小时,我无法弄清楚为什么它一直告诉我同样的错误。 对于那些想知道我的程序是什么的人来说,基本上它会读取一个包含条形码,名称和价格的文本文件。然后,我将读取另一个仅包含条形码的文本文件,并打印其各自的名称和价格。 不幸的是,它只打印一行然后显示此错误: -

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;
    }
}

3 个答案:

答案 0 :(得分:0)

从错误中,我们发现您正在尝试仅使用99项访问Arraylist的索引99。请记住,索引从0开始,因此在您出现之前,您只能达到98&#34;超出界限&#34; (这将为您提供上面看到的IndexOutOfBoundsException。)

IndexOutOfBoundsException告诉我们这一行是罪魁祸首:

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

counter0开始,这很好,但您允许counter转到size 99,因为您没有限制它。在counter到达99后,您尝试执行barcodes.get(counter),这当然会为您IndexOutOfBoundsException,因为99超出了barcodes的范围。

尝试在for循环中添加一个预防性if语句,在其他所有内容之前,当计数器变得过高时,将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语句。如果您将<更改为if (counter < size && (e.getBarcode() - barcodes.get(counter) == 0)) ,然后重新排列评估语句的顺序,则可以阻止此异常:

99

在这种情况下,一旦计数器达到counter < size,它将在&&上评估为false,并且由于双&符号({{1}}),if的后半部分 - 语句不会被评估,因此它将继续使用else语句。

请告诉我这是否适合您。

答案 1 :(得分:0)

当您说Search时,barcodes.size()方法会获得实际尺寸。

现在,counter基于零,并且在for循环内,您正在进行barcodes.get(counter)实际上直到barcodes大小+1。此外,{{1让它达到那个价值。

所以,你需要做的就是改变

counter <= size

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

答案 2 :(得分:0)

Search方法barcodes.size()中,您的实际尺寸为ArrayList。 但是,您的计数器是从0开始的。 因此,请尝试更改

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

为:

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