我有一个程序,我在其中制作一个arraylist来保存一些cab对象。我一直得到一个错误,我从消息中得到的是java不能识别arraylist中有对象。这是我得到的错误。
线程中的异常" main" java.lang.IndexOutOfBoundsException:索引:20,大小:20
at java.util.ArrayList.rangeCheck(Unknown Source)
在java.util.ArrayList.get(未知来源)
在edu.Tridenttech.MartiC.app.CabOrginazer.main(CabOrginazer.java:48)
这是我想要开始工作的代码
public class CabOrginazer {
private static List<CabProperties> cabs = new ArrayList<CabProperties>();
private static int count = 0;
private static boolean found = false;
public void cabOrginazer()
{
}
public static void main(String[] args) {
// TODO Auto-generated method stub
CabRecordReaper reaper = new CabRecordReaper("C:/CabRecords/September.txt");
CabProperties cabNum;
for(int i = 0; i < 20; i++)
{
cabNum = new CabProperties();
cabs.add(cabNum);
}
while(reaper.hasMoreRecords())
{
CabRecord file = reaper.getNextRecord();
for(int j = 0; j < cabs.size(); j++)
{
if(cabs.get(j).getCabID() == file.getCabId())
{
found = true;
cabs.get(j).setTypeAndValue(file.getType(), file.getValue(), file.getPerGallonCost());
cabs.get(j).setDate(file.getDateString());
break;
}
}
if(found == false)
{
cabs.get(count).setCabId(file.getCabId());
count++;
}
/*for(CabProperties taxi : cabs)
{
if(taxi.getCabID() == file.getCabId())
{
found = true;
taxi.setTypeAndValue(file.getType(), file.getValue(), file.getPerGallonCost());
taxi.setDate(file.getDateString());
break;
}
}*/
}
for(CabProperties taxi : cabs)
{
System.out.print("cab ID: " + taxi.getCabID());
System.out.print("\tGross earning: " + taxi.getGrossEarn());
System.out.print("\tTotal Gas Cost: " + taxi.getGasCost());
System.out.print("\tTotal Service Cost: " + taxi.getServiceCost());
System.out.println();
}
}
}
第48行是if语句中的内容cabs.get(count).setCabId(file.getCabId());
我对Java的了解很少。 Java应该知道cabs
中有元素,我应该可以设置cab的id
。是什么导致Java无法识别arraylist是否已填充?
答案 0 :(得分:7)
列表不是,填充了项目count
中的元素。查看异常:您在列表中有20个元素,因此有效索引为0到19(含)。你要求记录20(即第21记录)。那不存在。
听起来你的街区应该是这样的:
if (!found)
{
CabProperties properties = new CabProperties();
properties.setCabId(file.getCabId());
// Probably set more stuff
cabs.add(properties);
}
您很可能完全摆脱count
变量 - 以及具有虚拟属性的列表的初始填充。填充像这样的列表是非常奇怪的 - 这通常是你使用具有固定大小的数组所做的事情。使用List
等ArrayList
的主要好处之一是它的动态大小。
答案 1 :(得分:4)
Java正在认可成员。数组中有20个成员,从索引0到索引19索引。
您要求的索引20不存在。
循环:
while(reaper.hasMoreRecords())
运行次数必须超出预期,并且您的数据会多次触及found == false
if条件(您可以说if (!found) { ...
),并且在第21次失败时index-out-of-bounds exception。
您也应该弄清楚如何使用调试器。