循环无限循环或IndexOutOfBoundsException:Index = 4,Size = 2

时间:2017-06-27 22:25:04

标签: java android arraylist

在这个函数中,当我使用 For..Loop 时,无限循环,当我使用 While..Loop 时,我得到了错误: IndexOutOfBoundsException 。我想要做的是将元素从 imageInfosArrayList 中复制到 restrictedAreaArrayList 中,这里是代码:

 @Override
public void onLocationChanged(Location location) {
    //Toast.makeText(this,"Location changed!! wait for coordiates update",Toast.LENGTH_LONG).show();
    mLocation=location;


    latitudeMe=mLocation.getLatitude();
    longitudeMe=mLocation.getLongitude();
    Log.i(TAG,String.valueOf(latitudeMe+","+longitudeMe));

    getMyLocations(latitudeMe,longitudeMe);
    //getLocations("München Flughafen");
    Log.i(TAG,"Ziel coordinates "+String.valueOf(latitudeZiel+","+latitudeZiel));
   // for (int i = 0; i < imageInfosArrayList.size(); i++) {

    int i=0;
    while(i<imageInfosArrayList.size()){
        Log.e(TAG,imageInfosArrayList.toString());
        LatLng hier = getLocations(imageInfosArrayList.get(i).getPlace());
        if (hier != null) {
            Log.i(TAG, imageInfosArrayList.get(i).getPlace());

            distanceGeo = distance(hier.latitude, hier.longitude);
            ImageInfos imageInfos= new ImageInfos(mContext);



            if (distanceGeo <= Float.valueOf(distance[0])) {
                imageInfos= imageInfosArrayList.get(i);

                restrictedAreaArrayList.add(i,imageInfos);
                Log.e(TAG, "restrictedarea filling..." + restrictedAreaArrayList.size());
                i++;
            }
        } else {
            Log.i(TAG, "Can't locate this adress..." + imageInfosArrayList.get(i).getPlace());
            i++;
        }
    }

}

这是Logcat:

com.historyimages E/AndroidRuntime: FATAL EXCEPTION: main
                                                                    Process: bayram.com.historyimages, PID: 9792
                                                                    java.lang.IndexOutOfBoundsException: Index: 4, Size: 2
                                                                        at java.util.ArrayList.add(ArrayList.java:457)
                                                                        at bayram.com.historyimages.Umgebung.UmgebungFragment.onLocationChanged(UmgebungFragment.java:394)
                                                                        at com.google.android.gms.internal.zzasg$zzb$1.zza(Unknown Source)
                                                                        at com.google.android.gms.internal.zzasg$zzb$1.zzs(Unknown Source)
                                                                        at com.google.android.gms.internal.zzabh.zzb(Unknown Source)
                                                                        at com.google.android.gms.internal.zzabh$zza.handleMessage(Unknown Source)
                                                                        at android.os.Handler.dispatchMessage(Handler.java:105)
                                                                        at android.os.Looper.loop(Looper.java:156)
                                                                        at android.app.ActivityThread.main(ActivityThread.java:6524)
                                                                        at java.lang.reflect.Method.invoke(Native Method)
                                                                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:941)
                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:831)

2 个答案:

答案 0 :(得分:0)

好吧,我们没有for循环示例的代码,但我怀疑它在while循环中包含类似的错误。

你的循环,简化如下:

int i = 0;
while (i < size_of_x) {
    y = getlocations(h.get(i));
    if (y != null) {
        do_something()
        i++;
    }
    else {
        i++;
    }
}

让我们想象一下,h只有2个元素,所以get(0)和get(1)会起作用,但get(2)会失败。您的循环运行时具有以下行为:

  1. i = 0; getlocations(h.get(0))返回NULL; i = 1。
  2. i = 1; getLocations(h.get(1))返回NULL;我= 2。
  3. i = 2; getLocations(h.get(2))失败,因为索引超出范围,所以你得到一个IndexOutOfBoundsException。
  4. 我猜测你的for循环版本与你发布的代码有更多的差异,但可能会无限地运行#34;因为像getlocations()调用那样没有成功,你的终止条件并不令人满意。

    您需要重新考虑您在循环中所做的事情,特别是如果您正在进行可能失败的函数调用。您还应该练习我上面描述的练习,遍历您的代码,并检查循环中的行为是否与您期望或想要的一致。

答案 1 :(得分:0)

您在IndexOutOfBoundsException上获得restrictedAreaArrayList, 您正在添加imageInfos restrictedAreaArrayList

restrictedAreaArrayList.add(i,imageInfos);

索引可能不存在于restrictedAreaArrayList中,您只需添加

即可

restrictedAreaArrayList.add(imageInfos)

或者如果你想保留订单,那么使restrictedAreaArrayList的大小等于imageInfosArrayList 你可以用

创建它

restrictedAreaArrayList = new ArrayList<ImageInfos>(imageInfosArrayList.size());

或者

你可以打电话

restrictedAreaArrayList.ensureCapacity(imageInfosArrayList.size())

确保其容量与imageInfosArrayList

相同