我的地图类正在运行时显示的IndexOutofBoundException

时间:2013-03-01 09:25:59

标签: android android-mapview indexoutofboundsexception runtimeexception

现在我正在使用map类来显示map中两个位置之间的方向。但是当我运行此活动时它会在logcat中显示运行时异常。它指定索引outof bound异常有人请帮我解决这个问题。 我的活动类

public class CompassActivity extends MapActivity {
        MapView mv;

        MapController mc;

        Button Save, Cancel;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.car_finder_maplayout);
                MapView mv = (MapView)findViewById(R.id.carfinder_mapview);
                mv.setBuiltInZoomControls(true);
                MapController mc = mv.getController();
                ArrayList<GeoPoint> all_geo_points = getDirections(10.154929, 76.390316, 10.015861, 76.341867);
                GeoPoint moveTo = all_geo_points.get(0);
                mc.animateTo(moveTo);
                mc.setZoom(12);
                mv.getOverlays().add(new MyOverlay(all_geo_points));
        }

        public class MyOverlay extends Overlay {
                private ArrayList<GeoPoint> all_geo_points;

                public MyOverlay(ArrayList<GeoPoint> allGeoPoints) {
                        super();
                        this.all_geo_points = allGeoPoints;
                }

                @Override
                public boolean draw(Canvas canvas, MapView mv, boolean shadow, long when) {
                        super.draw(canvas, mv, shadow);
                        drawPath(mv, canvas);
                        return true;
                }

                public void drawPath(MapView mv, Canvas canvas) {
                        int xPrev = -1, yPrev = -1, xNow = -1, yNow = -1;
                        Paint paint = new Paint();
                        paint.setColor(Color.BLUE);
                        paint.setStyle(Paint.Style.FILL_AND_STROKE);
                        paint.setStrokeWidth(4);
                        paint.setAlpha(100);
                        if (all_geo_points != null) for (int i = 0; i < all_geo_points.size() - 4; i++) {
                                GeoPoint gp = all_geo_points.get(i);
                                Point point = new Point();
                                mv.getProjection().toPixels(gp, point);
                                xNow = point.x;
                                yNow = point.y;
                                if (xPrev != -1) {
                                        canvas.drawLine(xPrev, yPrev, xNow, yNow, paint);
                                }
                                xPrev = xNow;
                                yPrev = yNow;
                        }
                }
        }

        public static ArrayList<GeoPoint> getDirections(double lat1, double lon1, double lat2, double lon2) {
                String url = "http://maps.googleapis.com/maps/api/directions/xml?origin=" + lat1 + "," + lon1 + "&destination=" + lat2 + "," + lon2
                                + "&sensor=false&units=metric";
                String tag[] = {"lat", "lng"};
                ArrayList<GeoPoint> list_of_geopoints = new ArrayList<GeoPoint>();
                HttpResponse response = null;
                try {
                        HttpClient httpClient = new DefaultHttpClient();
                        HttpContext localContext = new BasicHttpContext();
                        HttpPost httpPost = new HttpPost(url);
                        response = httpClient.execute(httpPost, localContext);
                        InputStream in = response.getEntity().getContent();
                        DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
                        Document doc = builder.parse(in);
                        if (doc != null) {
                                NodeList nl1, nl2;
                                nl1 = doc.getElementsByTagName(tag[0]);
                                nl2 = doc.getElementsByTagName(tag[1]);
                                if (nl1.getLength() > 0) {
                                        list_of_geopoints = new ArrayList<GeoPoint>();
                                        for (int i = 0; i < nl1.getLength(); i++) {
                                                Node node1 = nl1.item(i);
                                                Node node2 = nl2.item(i);
                                                double lat = Double.parseDouble(node1.getTextContent());
                                                double lng = Double.parseDouble(node2.getTextContent());
                                                list_of_geopoints.add(new GeoPoint((int) (lat * 1E6), (int) (lng * 1E6)));
                                        }
                                } else {
                                        // No points found
                                }
                        }
                } catch (Exception e) {
                        e.printStackTrace();
                }
                return list_of_geopoints;
        }

        @Override
        protected boolean isRouteDisplayed() {
                // TODO Auto-generated method stub
                return true;
        }
}

logcat的

03-01 14:40:08.758: E/AndroidRuntime(1890): FATAL EXCEPTION: main
03-01 14:40:08.758: E/AndroidRuntime(1890): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.kodspider.parkon/com.kodspider.parkon.CompassActivity}: java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
03-01 14:40:08.758: E/AndroidRuntime(1890):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
03-01 14:40:08.758: E/AndroidRuntime(1890):     at android.app.ActivityThread.startActivityNow(ActivityThread.java:1900)
03-01 14:40:08.758: E/AndroidRuntime(1890):     at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:135)
03-01 14:40:08.758: E/AndroidRuntime(1890):     at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:347)
03-01 14:40:08.758: E/AndroidRuntime(1890):     at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:694)
03-01 14:40:08.758: E/AndroidRuntime(1890):     at android.widget.TabHost.setCurrentTab(TabHost.java:358)
03-01 14:40:08.758: E/AndroidRuntime(1890):     at android.widget.TabHost$2.onTabSelectionChanged(TabHost.java:150)
03-01 14:40:08.758: E/AndroidRuntime(1890):     at android.widget.TabWidget$TabClickListener.onClick(TabWidget.java:546)
03-01 14:40:08.758: E/AndroidRuntime(1890):     at android.view.View.performClick(View.java:4084)
03-01 14:40:08.758: E/AndroidRuntime(1890):     at android.view.View$PerformClick.run(View.java:16966)
03-01 14:40:08.758: E/AndroidRuntime(1890):     at android.os.Handler.handleCallback(Handler.java:615)
03-01 14:40:08.758: E/AndroidRuntime(1890):     at android.os.Handler.dispatchMessage(Handler.java:92)
03-01 14:40:08.758: E/AndroidRuntime(1890):     at android.os.Looper.loop(Looper.java:137)
03-01 14:40:08.758: E/AndroidRuntime(1890):     at android.app.ActivityThread.main(ActivityThread.java:4745)
03-01 14:40:08.758: E/AndroidRuntime(1890):     at java.lang.reflect.Method.invokeNative(Native Method)
03-01 14:40:08.758: E/AndroidRuntime(1890):     at java.lang.reflect.Method.invoke(Method.java:511)
03-01 14:40:08.758: E/AndroidRuntime(1890):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
03-01 14:40:08.758: E/AndroidRuntime(1890):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
03-01 14:40:08.758: E/AndroidRuntime(1890):     at dalvik.system.NativeStart.main(Native Method)
03-01 14:40:08.758: E/AndroidRuntime(1890): Caused by: java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
03-01 14:40:08.758: E/AndroidRuntime(1890):     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)
03-01 14:40:08.758: E/AndroidRuntime(1890):     at java.util.ArrayList.get(ArrayList.java:304)
03-01 14:40:08.758: E/AndroidRuntime(1890):     at com.kodspider.parkon.CompassActivity.onCreate(CompassActivity.java:43)
03-01 14:40:08.758: E/AndroidRuntime(1890):     at android.app.Activity.performCreate(Activity.java:5008)
03-01 14:40:08.758: E/AndroidRuntime(1890):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
03-01 14:40:08.758: E/AndroidRuntime(1890):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
03-01 14:40:08.758: E/AndroidRuntime(1890):     ... 18 more

2 个答案:

答案 0 :(得分:2)

您的错误是:java.lang.IndexOutOfBoundsException:索引0无效,大小为0

崩溃是在getDirections调用的调用者中的某个地方。 现在我发现有一个位置可能非常错误:

GeoPoint moveTo = all_geo_points.get(0);

get(0)如果其中没有,则会崩溃==&gt;你的错误

同样(次要)不需要第二次创建list_of_geopoints

list_of_geopoints = new ArrayList<GeoPoint>();

答案 1 :(得分:0)

您的getDirections(10.154929,76.390316,10.015861,76.341867)很可能不会返回任何积分。你得到一个空数组并尝试读取第一个元素。应该调试此方法以查看它为什么没有得到任何结果。

为了避免对没有返回点的路由进行的任何调用崩溃,你应该这样做:

if (all_geo_points != null && all_geo_points.size() > 0) {
    GeoPoint moveTo = all_geo_points.get(0);
    mc.animateTo(moveTo);
    mc.setZoom(12);
    mv.getOverlays().add(new MyOverlay(all_geo_points));
}