我有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<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)
答案 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));
}
}