Java 向ArrayList添加项时发生IndexOutOfBounds异常
为了显示图表,我有一个异步任务,它读取大量产品列表,获取它们的类型并将它们添加到不同的子列表中。这是我的代码:Java 向ArrayList添加项时发生IndexOutOfBounds异常,java,android,indexoutofboundsexception,Java,Android,Indexoutofboundsexception,为了显示图表,我有一个异步任务,它读取大量产品列表,获取它们的类型并将它们添加到不同的子列表中。这是我的代码: List<List<Bundle>> productsByType; ... private class LoadDataForChart extends AsyncTask<Void, Float, Boolean> { @Override protected void onPreExecute() {
List<List<Bundle>> productsByType;
...
private class LoadDataForChart extends AsyncTask<Void, Float, Boolean> {
@Override
protected void onPreExecute() {
}
@Override
protected Boolean doInBackground(Void... params) {
productsByType = new ArrayList<>();
productsByType.add(new ArrayList<Bundle>());
productsByType.add(new ArrayList<Bundle>());
productsByType.add(new ArrayList<Bundle>());
productsByType.add(new ArrayList<Bundle>());
productsByType.add(new ArrayList<Bundle>());
List<Bundle> allProducts = dataManager.getAllProducts();
for(int i = 0; i < allProducts.size(); i++)
{
Bundle product = allProducts.get(i);
List<Bundle> productsByTypeSublist = null;
String productType = product.getString("type");
if(productType.equals("1"))
productsByTypeSublist = productsByType.get(0);
else if(productType.equals("2"))
productsByTypeSublist = productsByType.get(1);
else if(productType.equals("3"))
productsByTypeSublist = productsByType.get(2);
else if(productType.equals("4"))
productsByTypeSublist = productsByType.get(3);
else if(productType.equals("5"))
productsByTypeSublist = productsByType.get(4);
if(productsByTypeSublist != null)
productsByTypeSublist.add(product);
}
return true;
}
@Override
protected void onProgressUpdate(Float... values) {
}
@Override
protected void onPostExecute(Boolean result) {
showChartData();
}
@Override
protected void onCancelled() {
}
}
第524行是productsByTypeSublist.add行。有些碰撞是“长度=10;指数=10”,有些碰撞是“长度=33;指数=33”,等等。。。我想这取决于所有产品都有什么(?)
我不明白的是为什么我要在列表中获取ArrayIndexOutOfBoundsException.add方法??特别是当我对arrayList没有限制,并且我添加了没有和索引的项,只是在列表的末尾
我认为这可能是一个线程问题,即使这是Crashlytics日志的问题,而问题实际上在我的代码的另一点上
代码对我来说似乎很简单,我缺少什么?
ArrayList
是不同步的,即当一个线程试图从中获取某些内容时,另一个线程可以修改它,反之亦然
您是否尝试过使用productsByType.add(Collections.synchronizedList(new ArrayList())
在旁注中,您可以重写以下代码块
if(productType.equals("1"))
productsByTypeSublist = productsByType.get(0);
else if(productType.equals("2"))
productsByTypeSublist = productsByType.get(1);
else if(productType.equals("3"))
productsByTypeSublist = productsByType.get(2);
else if(productType.equals("4"))
productsByTypeSublist = productsByType.get(3);
else if(productType.equals("5"))
productsByTypeSublist = productsByType.get(4);
简单地说
productsByTypeSublist = productsByType.get(Integer.parseInt(productType) - 1);
ChartsFragment.java:524
ChartsFragment.java的第524行是什么?524是这一行:productsByTypeSublist.add(产品);allProducts()的作用是什么(inti=0;iproductsByTypeSublist = productsByType.get(Integer.parseInt(productType) - 1);