我一直在看它一个小时,我无法弄清楚为什么它一直告诉我同样的错误。 对于那些想知道我的程序是什么的人来说,基本上它会读取一个包含条形码,名称和价格的文本文件。然后,我将读取另一个仅包含条形码的文本文件,并打印其各自的名称和价格。 不幸的是,它只打印一行然后显示此错误: -
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;
}
}
答案 0 :(得分:0)
从错误中,我们发现您正在尝试仅使用99
项访问Arraylist的索引99
。请记住,索引从0
开始,因此在您出现之前,您只能达到98
&#34;超出界限&#34; (这将为您提供上面看到的IndexOutOfBoundsException
。)
IndexOutOfBoundsException
告诉我们这一行是罪魁祸首:
if ((e.getBarcode() - barcodes.get(counter) == 0) && counter <= size)
counter
从0
开始,这很好,但您允许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))