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);