0

이제 map 클래스에서 두 위치 간의 방향을 보여주고 있습니다.하지만이 액티비티를 실행하면 logcat.And에 런타임 예외가 표시되어 인덱스 outof bound가 지정됩니다. 예외 누군가가이 문제를 해결하도록 도와주세요. 내 활동 클래스내지도 클래스가 실행되는 동안 IndexOutofBoundException이 표시됩니다.

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

로그 캣

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 
+0

뭐죠? –

+0

'getDirections' 함수를 디버그하려고합니까? –

+0

@AbhinavSinghMaurya : 죄송합니다. 지금 질문을 수정했습니다. – Niko

답변

2

귀하의 오류는 다음과 같습니다 java.lang.IndexOutOfBoundsException : 잘못된 인덱스 0, 크기는 충돌이 어딘가에 0

입니다 getDirections 호출의 호출 원입니다. 거기에 아무도 ==>는 오류가없는 경우

GeoPoint moveTo = all_geo_points.get(0); 

get(0)

는 또한

(작은) list_of_geopoints의 두 번째 창조가 아닌 충돌합니다 : 지금 1 개 위치 나 자리 끔찍하게 잘못 될 수있다 필요 :

list_of_geopoints = new ArrayList<GeoPoint>(); 
+0

여전히 변경되지 않습니다. 동일한 오류가 남아 있습니다. – Niko

+0

@Balavishnu 코드를 디버그하고 배열 목록의 크기를 확인하십시오. –

+0

무엇이 변경 되었습니까? 응용 프로그램 디버깅을 시도 했습니까? 나는 당신이 쉽게 그 문제를 아주 빨리 발견 할 수 있다고 생각한다. ... – RvdK

0

귀하의 getDirections (10.154929, 76.390316, 10.015861, 76.341867) 가장 가능성이있는 점을 반환하지 않습니다. 빈 배열을 가져오고 첫 번째 요소를 읽으려고합니다. 이 메소드는 결과를 얻지 못하는 이유를보기 위해 디버깅되어야합니다.

은 다음과 같이해야 할 점을 반환하지 않는 경로에 대해 수행 모든 통화에 대해 충돌을 방지하려면 :

라인 CompassActivity.java:43에
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)); 
}