我正在尝试将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)
答案 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