为什么Collections.copy与ArrayList会产生IndexOutOfBounds异常?

时间:2014-05-26 11:47:49

标签: java collections arraylist io tags

我正在尝试将String数组的元素复制到另一个,但会发生此异常。 我知道当ArrayLists的大小不同时会出现异常,但我甚至在考虑第一个大小的情况下定义了第二个。

这是代码,顺便说一句,我正在尝试创建一个程序来读取txt文件,并使用ArrayList作为标记名称的持有者来检查其中的数据是否有序。

import java.io.*;
import java.util.*;

public class Reader1 {

   public static void main(String args[]) throws IOException
   {
    FileInputStream in = null;

      ArrayList<String> tag_tester = new ArrayList<String>(35);

      tag_tester.add("ITEM");
      tag_tester.add("ITEM_LIST");
      tag_tester.add("ITEM_TYPE");
      tag_tester.add("MODEL");
      tag_tester.add("MODEL_YEAR");
      tag_tester.add("MANUFACTURER");
      tag_tester.add("PRICE");
      tag_tester.add("SCREEN_TYPE");
      tag_tester.add("DIMENSIONS");
      tag_tester.add("RESOLUTION");
      tag_tester.add("INTERFACES");
      tag_tester.add("PIECES");
      tag_tester.add("CPU_TYPE");
      tag_tester.add("CAPACITY");
      tag_tester.add("EXTENSIONS_NUMBER");
      tag_tester.add("CPU_SPEED");
      tag_tester.add("CORE_NUMBER");
      tag_tester.add("CHIPSET");
      tag_tester.add("RAM_TYPE");
      tag_tester.add("SPEED");
      tag_tester.add("HD_TYPE");
      tag_tester.add("SIZE");
      tag_tester.add("CONNECTION");
      tag_tester.add("TECHNOLOGY");
      tag_tester.add("PRINT_TYPE");
      tag_tester.add("ORDER");
      tag_tester.add("ORDER_LIST");
      tag_tester.add("NAME");
      tag_tester.add("PHONE");
      tag_tester.add("NUMBER");
      tag_tester.add("ORDER_DATE");
      tag_tester.add("DELIVERY_DATE");
      tag_tester.add("SALE");
      tag_tester.add("SALES_LIST");
      tag_tester.add("MODEL");
      tag_tester.add("SALE_DATE");

      ArrayList<String> tag_backup = new ArrayList<String>(tag_tester.size());



      try {


        BufferedReader br = new BufferedReader(new FileReader("AVAILABLE PRODUCTS.txt"));
        String line;
        int flag;
            Collections.copy(tag_backup,tag_tester);
            line = br.readLine();
            do{

                    flag=0;
                    do{

                        for(int i=0; i<tag_backup.size(); i++) {
                            if ((line.trim().startsWith(tag_backup.get(i))) || (line.trim().startsWith("{")) || (line.trim().startsWith("}"))) {
                                tag_backup.set(i,"");
                                flag=1;
                            }   
                        }
                        line = br.readLine();

                    }while ((line.trim().startsWith("}")) || flag==0);
                    Collections.copy(tag_backup,tag_tester);
            }while ((line = br.readLine()) != null || flag==0);
            if (flag==1){
                System.out.println("error");
            }
            else{
                System.out.println("check was succesful");
            }



              }finally {
                 if (in != null) {  
                    in.close();
                 }

              }
           }
        }

这是txt文件。

ITEM_LIST
{    
    ITEM
    {
        ITEM_TYPE monitor
        MODEL 124C300EW
        MODEL_YEAR 2013
        MANUFACTURER Samsung
        PRICE 180
        SCREEN_TYPE LED
        DIMENSIONS 24
        RESOLUTION 1920x1080
        INTERFACES “HDMI DVI Component Scart USB”
        PIECES 2
    }
    ITEM
    {
        ITEM_TYPE motherboard
        MODEL T31D800RT
        MODEL_YEAR 2013
        MANUFACTURER Asus
        PRICE 100
        CPU_TYPE Intel
        CAPACITY 64
        EXTENSIONS_NUMBER 6
    }
    ITEM
    {
        ITEM_TYPE cpu
        MODEL P70R280TY
        MODEL_YEAR 2012
        MANUFACTURER AMD
        PRICE 150
        CPU_SPEED 3.5
        CORE_NUMBER 8
    }
    ITEM
    {
        ITEM_TYPE graphics
        MODEL L32M689RI
        MODEL_YEAR 2014
        MANUFACTURER AMD
        PRICE 160
        CHIPSET AMD
        CAPACITY 6
    }
    ITEM
    {
        ITEM_TYPE ram
        MODEL K64F458VH
        MODEL_YEAR 2013
        MANUFACTURER Kingston
        PRICE 90
        RAM_TYPE DDR3
        CAPACITY 4
        SPEED 1600
    }
    ITEM
    {
        ITEM_TYPE hd
        MODEL Y18T479UI
        MODEL_YEAR 2013
        MANUFACTURER Seagate
        PRICE 50
        HD_TYPE HDD
        SIZE 2.5
        CAPACITY 750
    }
    ITEM
    {
        ITEM_TYPE keyboard
        MODEL L58S523KL
        MODEL_YEAR 2013
        MANUFACTURER Logitech
        PRICE 25
        CONNECTION Wireless
    }
    ITEM
    {
        ITEM_TYPE mouse
        MODEL I59L460BV
        MODEL_YEAR 2013
        MANUFACTURER Microsoft
        PRICE 15
        TECHNOLOGY Laser
        CONNECTION Wired
    }
    ITEM
    {
        ITEM_TYPE printer
        MODEL O35I132LP
        MODEL_YEAR 2013
        MANUFACTURER HP
        PRICE 110
        TECHNOLOGY Laser
        PRINT_TYPE COLORED
    }
}

也许我不应该使用ArrayList来完成这项任务?提前谢谢。

编辑:有人请求堆栈跟踪,这里是:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Source does not fit in        dest
        at java.util.Collections.copy(Collections.java:589)
        at Reader1.main(Reader1.java:59)

编辑2:在用tag_backup构造函数替换第一个Collections.copy之后,弹出了另一个异常:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size:
0
        at java.util.ArrayList.rangeCheck(ArrayList.java:635)
        at java.util.ArrayList.get(ArrayList.java:411)
        at Reader1.main(Reader1.java:67)

2 个答案:

答案 0 :(得分:1)

这是你的循环问题

for(int i=0; i>35; i++)

制作

for(int i=0; i<35; i++)

然后试试。

答案 1 :(得分:1)

您使List s的容量相同并不意味着尺寸相同。 new ArrayList(35)创建(大小= 0)ArrayList 容量 35. Collections.copy需要List s <目标List的强>大小至少应为来源List的大小。


建议

  • 使用ArrayList(Collection)构造函数而不是 first Collections.copy(之后未修改的列表长度,因此 second {{1应该工作)

  • 您可以使用Collections.copy来获取列表(不是问题的一部分,而是良好做法),而不是创建ArrayList并添加35 String


修改

如果代码被我所描述的替换并在具有给定内容的文件上运行,那么内部while循环就会发生Arrays.asList(String...)

澄清修改

代替

NullPointerException

ArrayList<String> tag_tester = new ArrayList<String>(35);

tag_tester.add("ITEM");
tag_tester.add("ITEM_LIST");
tag_tester.add("ITEM_TYPE");
...
tag_tester.add("SALE_DATE");

删除以下行

List<String> tag_tester = Arrays.asList(
    "ITEM_LIST", // just speculated and switched the first 2 elements
    "ITEM",      // since they appear in a different order in your file
    "ITEM_TYPE",
    ...,
    "SALE_DATE");

代替

ArrayList<String> tag_backup = new ArrayList<String>(tag_tester.size());

int flag;
    Collections.copy(tag_backup,tag_tester);

要摆脱int flag; ArrayList<String> tag_backup = new ArrayList<String>(tag_tester); ,你必须修改你的循环。

也许你想要这样的东西:

NullPointerException