类型为double []的ArrayList在使用get()方法时抛出IndexOutOfBounds异常

时间:2018-05-03 02:06:08

标签: java android arraylist

我有ArrayList<double[]> coordinatesArray = new ArrayList<>();

我试图通过这样做获得第一个索引:

double[] firstCoords = coordinatesArray.get(0);

当我运行我的Android应用时,它崩溃了:

java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0

仅供参考,coordinatesArray有数据,即100%经过验证。 但为什么会出现这种错误?有人见过这个吗?

更新 我的onMapReady方法会从Google Maps API调用代码。如果firstCoords = coordinatesArray.get(0);被注释掉,地图将根据提供的坐标显示折线。

这是我的调试窗口的图片当这条线被注释掉时:

ArrayList of size 22

ArrayList<double[]> coordinatesArray = new ArrayList<>();

PolylineOptions options;
@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;

    double[] firstCoords;
    double[] lastCoords;
    double[] receivedDataArray;
    double latitude;
    double longitude;

    ArrayList<LatLng> coordList = new ArrayList<LatLng>();


    for (int i = 0; i < coordinatesArray.size() - 1; i++) {
        receivedDataArray = coordinatesArray.get(i);

        latitude = receivedDataArray[0];
        longitude = receivedDataArray[1];

        coordList.add(new LatLng(latitude,longitude));
    }

    options = new PolylineOptions().addAll(coordList).width(10).color(Color.BLUE).geodesic(true);
    mMap.addPolyline(options);

    firstCoords = coordinatesArray.get(0);
    //lastCoords = coordinatesArray.get(coordinatesArray.size() - 1);

    //marker for beginning location
    LatLng firstLocationPointOfDevice = new LatLng(49, -122);

    //LatLng firstLocationPointOfDevice = new LatLng(firstCoords[0], firstCoords[1]);
    mMap.addMarker(new MarkerOptions().position(firstLocationPointOfDevice).title("Starting Location"));

    mMap.moveCamera(CameraUpdateFactory.newLatLng(firstLocationPointOfDevice));
    mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(firstLocationPointOfDevice, 10));
}

现在当我取消注释firstCoords = coordinatesArray.get(0);并运行代码时,运行我的MapActivity类时会出现以下堆栈跟踪:

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: vatracking.project.vatrackingapp, PID: 10898
                  java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
                      at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
                      at java.util.ArrayList.get(ArrayList.java:308)
                      at vatracking.project.vatrackingapp.MapActivity.onMapReady(MapActivity.java:122)
                      at com.google.android.gms.maps.zzak.zza(Unknown Source)
                      at com.google.android.gms.maps.internal.zzaq.dispatchTransaction(Unknown Source)
                      at com.google.android.gms.internal.maps.zzb.onTransact(Unknown Source)
                      at android.os.Binder.transact(Binder.java:387)
                      at fh.b(:com.google.android.gms.dynamite_dynamitemodulesb@12529017@12.5.29 (040300-192802242):20)
                      at com.google.android.gms.maps.internal.bg.a(:com.google.android.gms.dynamite_dynamitemodulesb@12529017@12.5.29 (040300-192802242):5)
                      at com.google.maps.api.android.lib6.impl.be.run(:com.google.android.gms.dynamite_dynamitemodulesb@12529017@12.5.29 (040300-192802242):5)
                      at android.os.Handler.handleCallback(Handler.java:739)
                      at android.os.Handler.dispatchMessage(Handler.java:95)
                      at android.os.Looper.loop(Looper.java:158)
                      at android.app.ActivityThread.main(ActivityThread.java:7225)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

1 个答案:

答案 0 :(得分:0)

答案非常简单。加载包含onMapReady方法的Android中的活动时,会自动调用该活动。在我的例子中,onMapReady包含一个ArrayList,其数据调用get()方法从数组中检索某些东西,但如果 arraylist中没有数据那么它会抛出一个错误。

在我的情况下,我错过了一个检查,看看ArrayList中是否存在数据,所以这正是修复问题的原因。

@Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;

        double[] firstCoords;
        double[] lastCoords;
        double[] receivedDataArray;
        double latitude;
        double longitude;

        ArrayList<LatLng> coordList = new ArrayList<LatLng>();


        for (int i = 0; i < coordinatesArray.size() - 1; i++) {
            receivedDataArray = coordinatesArray.get(i);

            latitude = receivedDataArray[0];
            longitude = receivedDataArray[1];

            coordList.add(new LatLng(latitude,longitude));
        }

        options = new PolylineOptions().addAll(coordList).width(10).color(Color.BLUE).geodesic(true);
        mMap.addPolyline(options);

        // if user selected date in date-time picker then marker will point to
        // first set of coordinates in the coordinatesArray and the map will zoom in on that point
        if(!coordinatesArray.isEmpty())
        {
            // get first set of coordinates from array as starting position
            firstCoords = coordinatesArray.get(0);

            // get last set of coordinates from array as ending position
            lastCoords = coordinatesArray.get(coordinatesArray.size() - 1);

            // place marker for starting position
            LatLng firstLocationPointOfDevice = new LatLng(firstCoords[0], firstCoords[1]);
            mMap.addMarker(new MarkerOptions().position(firstLocationPointOfDevice).icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN)).title("Starting Location"));

            // place marker for ending position
            LatLng lastLocationPointOfDevice = new LatLng(lastCoords[0], lastCoords[1]);
            mMap.addMarker(new MarkerOptions().position(lastLocationPointOfDevice).icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)).title("Ending Location"));

            // zoom in on first set of coordinates form coordinatesArray
            mMap.moveCamera(CameraUpdateFactory.newLatLng(firstLocationPointOfDevice));

            // camera zoom in position
            mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(firstLocationPointOfDevice, 10));
        }
        // if user did not select any date from date time picker, then by default the map will zoom on vancouver
        else if(coordinatesArray.isEmpty())
        {
            // default location if no date is selected
            LatLng defaultLocation = new LatLng(49.2827, -123.1207);
            mMap.moveCamera(CameraUpdateFactory.newLatLng(defaultLocation));
            mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(defaultLocation, 10));
        }
    }