2013-12-10 2 views
0

Я написал функцию для вычисления расстояния и отражения в текстовом виде в виде списка. Теперь это дает параметр Array Index Of Bounds Exception. Что может быть ошибкой здесь? Поскольку остальная часть кода использовалась для получения результатов ранее, но после добавления этой функции это приложение разрушается.Android List View Array Index Out Of Bounds Exception

Route.java

public class Route extends Activity 
{ 
ImageView exit, home, liveview, pinmap; 
ArrayList<String> tolist; 
ArrayList<String> distancelist; 
List<String> greenl,bluel,redl,yellowl; 
ListView list; 
String Source,Destination; 
Myadapter adapter; 
MyDataBase mdb; 
Integer[] dis=new Integer[97]; 
Integer[] disbetween=new Integer[97]; 
Boolean b=true; 
Location mySourceLocation,myTargetLocation; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.routemap); 
    list=(ListView) findViewById(R.id.listView1); 
    tolist=new ArrayList<String>(); 
    distancelist=new ArrayList<String>(); 
    mdb=new MyDataBase(this); 
    mdb.open(); 
    mySourceLocation=new Location(""); 
    myTargetLocation=new Location(""); 
    String[] stops = { 
      "Bangalore International Exhibition Center", "Jindal", "Manjunathnagar", "Nagasandra", "Dasarahalli", "Jalahalli", "Peenya Industry", "Peenya", "Yeswanthpur Industry", "Yeswanthpur", "Sandal Soap Factory", "Mahalaxmi", "Rajajinagar", "Kuvempu Road", "Srirampura", "Sampige Road", "Kempegowda Interchange", "Chikpet", "K R Market", "National College", "Lalbagh", "South End Circle", "Jayanagar", "R V Road Interchange", "Banashankari", "J P Nagar", "Puttenahalli", "Anjanapura Cross Road", "Krishna Leela Park", "Vajrahalli", "Thaighattapura", "Anjanapura/NICE Junction", "Kengeri", "R V College of Engineering", "Bangalore University Cross", "Rajarajeshwari Nagar", "Nayandahalli", "Mysore Road", "Deepanjali Nagar", "Attiguppe", "Vijayanagar", "Hosahalli", "Magadi Road", "City Railway Station", "Sir M Vishweshwariah", "Vidhana Soudha", "Cubbon Park", "M G Road Interchange", "Trinity", "Halasuru", "Indiranagar", "S V Road", "Baiyyappanahalli", "Jyotipura", "K R Puram", "Mahadevpura", "Garudacharpalya", "Doddanekkundi Induatrial State", "Vishweshwariah Industrial State", "Kundanahalli", "Vydhehi Hospital", "Satya Sai Medical Institute", "ITPB", "Kadugodi Industrial Area", "Ujjwal Vidhyalaya", "Whitefield", "Nagawara", "Arabic College", "Venkateshpura", "Tannery Town", "Pottery Town", "Cantonment Railway Station", "Shivajinagar", "Vellara Junction", "Langford Town", "Mico Bosch", "Dairy Circle", "Swagath Road Cross", "Jayadeva Hospital Interchange", "J P Nagar 4th Phase", "IIMB", "Hulimavu", "Gottigere", "Ragigudda Temple", "BTM Layout", "Silk Board", "HSR Layout", "Oxford College", "Muneshwara Nagar", "Chikkabegur", "Basapura Road", "Hosa Road", "Electronics City 1", "Electronics City 2", "Huskur Road", "Hebbagodi", "Bommasandra" 
      }; 
    String[] operationalstops = {"M G Road Interchange","Trinity", "Halasuru", "Indiranagar", "S V Road", "Baiyyappanahalli"}; 

    String[] greenline = {"Bangalore International Exhibition Center", "Jindal", "Manjunathnagar", "Nagasandra", "Dasarahalli", "Jalahalli", "Peenya Industry", "Peenya", "Yeswanthpur Industry", "Yeswanthpur", "Sandal Soap Factory", "Mahalaxmi", "Rajajinagar", "Kuvempu Road", "Srirampura", "Sampige Road", "Kempegowda Interchange", "Chikpet", "K R Market", "National College", "Lalbagh", "South End Circle", "Jayanagar", "R V Road Interchange", "Banashankari", "J P Nagar", "Puttenahalli", "Anjanapura Cross Road", "Krishna Leela Park", "Vajrahalli", "Thaighattapura", "Anjanapura/NICE Junction"}; 

    String[] blueline = {"Kengeri", "R V College of Engineering", "Bangalore University Cross", "Rajarajeshwari Nagar", "Nayandahalli", "Mysore Road", "Deepanjali Nagar", "Attiguppe", "Vijayanagar", "Hosahall1i", "Magadi Road", "City Railway Station", "Kempegowda Interchange", "Sir M Vishweshwariah", "Vidhana Soudha", "Cubbon Park", "M G Road Interchange", "Trinity", "Halasuru", "Indiranagar", "S V Road", "Baiyyappanahalli", "Jyotipura", "K R Puram", "Mahadevpura", "Garudacharpalya", "Doddanekkundi Induatrial State", "Vishweshwariah Industrial State", "Kundanahalli", "Vydhehi Hospital", "Satya Sai Medical Institute", "ITPB", "Kadugodi Industrial Area", "Ujjwal Vidhyalaya", "Whitefield"}; 

    String[] redline = {"Nagawara", "Arabic College", "Venkateshpura", "Tannery Town", "Pottery Town", "Cantonment Railway Station", "Shivajinagar", "M G Road Interchange", "Vellara Junction", "Langford Town", "Mico Bosch", "Dairy Circle", "Swagath Road Cross", "Jayadeva Hospital Interchange", "J P Nagar 4th Phase", "IIMB", "Hulimavu", "Gottigere"}; 

    String[] yellowline = {"R V Road Interchange", "Ragigudda Temple", "Jayadeva Hospital Interchange", "BTM Layout", "Silk Board", "HSR Layout", "Oxford College", "Muneshwara Nagar", "Chikkabegur", "Basapura Road", "Hosa Road", "Electronics City 1", "Electronics City 2", "Huskur Road", "Hebbagodi", "Bommasandra"}; 

    greenl=Arrays.asList(greenline); 
    bluel=Arrays.asList(blueline); 
    redl=Arrays.asList(redline); 
    yellowl=Arrays.asList(yellowline); 

    adapter=new Myadapter(); 

} 


**************************The function causing crash****************************** 

public void distanceBetweenStations() { 
    for(int i=0;i<tolist.size();i++) 
    { 
    Cursor c1=mdb.getStops(tolist.get(i)); 
    while(c1.moveToNext()) 
    { 
     if(b) 
     { 
      Double lati=c1.getDouble(2); 
      Double longi=c1.getDouble(3); 
      mySourceLocation.setLatitude(lati); 
      mySourceLocation.setLongitude(longi); 
      disbetween[i]=0; 
      distancelist.add(disbetween[i].toString()); 
      dis[i]=0; 
      b=false; 
     } 
     else 
     { 
     Double lati=c1.getDouble(2); 
     Double longi=c1.getDouble(3); 
     myTargetLocation.setLatitude(lati); 
     myTargetLocation.setLongitude(longi); 
     dis[i]=(int) mySourceLocation.distanceTo(myTargetLocation); 
     disbetween[i]=dis[i]-dis[i-1]; 
     distancelist.add(disbetween[i].toString()); 
     Toast.makeText(getApplicationContext(),longi+" "+lati+" "+disbetween[i], 1).show();  
     } 
    } 
    } 
    adapter.notifyDataSetChanged(); 
} 

*************************The function causing crash******************************* 

class Myadapter extends BaseAdapter 
    { 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return tolist.size(); 
    } 

    @Override 
    public Object getItem(int pos) { 
     // TODO Auto-generated method stub 
     return tolist.get(pos); 
    } 

    @Override 
    public long getItemId(int position) { 
     // TODO Auto-generated method stub 
     return position; 
    } 

RouteList.xml

<TextView 
    android:id="@+id/textView3" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentRight="true" 
    android:layout_alignParentTop="true" 
    android:text="Medium Text" 
    android:textAppearance="?android:attr/textAppearanceMedium" /> 

<TextView 
    android:id="@+id/textView4" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentRight="true" 
    android:layout_alignParentTop="true" 
    android:layout_marginTop="22dp" 
    android:text="Medium Text" 
    android:textAppearance="?android:attr/textAppearanceMedium" /> 

<TextView 
    android:id="@+id/textView1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignBottom="@+id/textView4" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentTop="true" 
    android:layout_toLeftOf="@+id/textView3" 
    android:text="Large Text" 
    android:gravity="center" 
    android:textAppearance="?android:attr/textAppearanceLarge" /> 

</RelativeLayout> 

Routemap.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:background="@drawable/backfront" 
android:orientation="vertical" > 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_marginBottom="7dp" 
    android:layout_marginLeft="7dp" 
    android:layout_marginRight="7dp" 
    android:layout_marginTop="7dp" 
    android:background="@drawable/back" 
    android:orientation="horizontal" > 

    <TextView 
     android:id="@+id/RouteText" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:gravity="center" 
     android:textColor="#FFFFFF" /> 
</LinearLayout> 

<RelativeLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_marginBottom="7dp" 
    android:layout_marginLeft="7dp" 
    android:layout_marginRight="7dp" 
    android:layout_marginTop="7dp" > 

    <ImageView 
     android:id="@+id/exit" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentRight="true" 
     android:layout_marginBottom="10dp" 
     android:layout_marginTop="10dp" 
     android:layout_marginRight="20dp" 
     android:src="@drawable/exitapp" /> 

    <ImageView 
     android:id="@+id/mapview" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_toLeftOf="@id/exit" 
     android:layout_alignParentBottom="true" 
     android:layout_marginBottom="10dp" 
     android:layout_marginTop="10dp" 
     android:layout_marginRight="20dp" 
     android:src="@drawable/pinmap" /> 

     <ImageView 
     android:id="@+id/showlive" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_toLeftOf="@id/mapview" 
     android:layout_alignParentBottom="true" 
     android:layout_marginBottom="10dp" 
     android:layout_marginTop="10dp" 
     android:layout_marginRight="20dp" 
     android:src="@drawable/pinmap" /> 

     <ImageView 
     android:id="@+id/home" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_toLeftOf="@id/showlive" 
     android:layout_alignParentBottom="true" 
     android:layout_marginBottom="10dp" 
     android:layout_marginTop="10dp" 
     android:layout_marginRight="20dp" 
     android:src="@drawable/home" /> 

    <ListView 
     android:id="@+id/listView1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_above="@+id/exit" 
     android:paddingBottom="30dp" > 
    </ListView> 
</RelativeLayout> 

</LinearLayout> 

LogCat Выход

enter image description here

12-10 12:49:31.577: E/AndroidRuntime(20793): FATAL EXCEPTION: main 
12-10 12:49:31.577: E/AndroidRuntime(20793): java.lang.RuntimeException: Unable to start activity ComponentInfo{veniteck.solutions.mapmymetro/veniteck.solutions.mapmymetro.Route}: java.lang.ArrayIndexOutOfBoundsException: length=97; index=-1 
12-10 12:49:31.577: E/AndroidRuntime(20793): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2077) 
12-10 12:49:31.577: E/AndroidRuntime(20793): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2104) 
12-10 12:49:31.577: E/AndroidRuntime(20793): at android.app.ActivityThread.access$600(ActivityThread.java:134) 
12-10 12:49:31.577: E/AndroidRuntime(20793): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1247) 
    12-10 12:49:31.577: E/AndroidRuntime(20793): at android.os.Handler.dispatchMessage(Handler.java:99) 
12-10 12:49:31.577: E/AndroidRuntime(20793): at android.os.Looper.loop(Looper.java:154) 
12-10 12:49:31.577: E/AndroidRuntime(20793): at android.app.ActivityThread.main(ActivityThread.java:4624) 
12-10 12:49:31.577: E/AndroidRuntime(20793): at java.lang.reflect.Method.invokeNative(Native Method) 
12-10 12:49:31.577: E/AndroidRuntime(20793): at java.lang.reflect.Method.invoke(Method.java:511) 
12-10 12:49:31.577: E/AndroidRuntime(20793): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:809) 
12-10 12:49:31.577: E/AndroidRuntime(20793): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:576) 
12-10 12:49:31.577: E/AndroidRuntime(20793): at dalvik.system.NativeStart.main(Native Method) 
12-10 12:49:31.577: E/AndroidRuntime(20793): Caused by: java.lang.ArrayIndexOutOfBoundsException: length=97; index=-1 
12-10 12:49:31.577: E/AndroidRuntime(20793): at veniteck.solutions.mapmymetro.Route.distanceBetweenStations(Route.java:161) 
12-10 12:49:31.577: E/AndroidRuntime(20793): at veniteck.solutions.mapmymetro.Route.sameline(Route.java:359) 
12-10 12:49:31.577: E/AndroidRuntime(20793): at veniteck.solutions.mapmymetro.Route.onCreate(Route.java:90) 
12-10 12:49:31.577: E/AndroidRuntime(20793): at android.app.Activity.performCreate(Activity.java:4479) 
12-10 12:49:31.577: E/AndroidRuntime(20793): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1050) 
12-10 12:49:31.577: E/AndroidRuntime(20793): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2041) 
1 2-10 12:49:31.577: E/AndroidRuntime(20793): ... 11 more 
12-10 12:49:33.191: D/dalvikvm(20793): threadid=11: interp stack at 0x4d442000 
+0

Пожалуйста, разместите * stacktrace * и опубликуйте [SSCCE] (http://sscce.org/). – Maroun

+0

Опубликовать logcat –

+0

Можете ли вы проверить количество элементов в списке –

ответ

0

В вашем Метод distanceBetweenStations() у вас есть эта линия в разделе еще:

disbetween[i]=dis[i]-dis[i-1]; 

, который будет производить ArrayIndexOutOfBoundsException. Зачем?

В вашем методе, вы создаете курсор:

Cursor c1=mdb.getStops(tolist.get(i)); 

и начать While() цикл:

while(c1.moveToNext()) { 

Если есть более чем 1 строка курсора, на первой итерации, первый условие выполняется (так как b истинно), поэтому ваша проблемная линия еще не запущена. Но вы настраиваете б к ложным, так и на втором ряду, ваш другой раздел называется, и помня о том, что я по-прежнему 0, то есть:

disbetween[0] = dis[0] - dis[-1]; <--------- can't access 

Я не уверен, что вы пытаетесь сделать, так это лишь некоторые идеи, как предотвратить исключение:

  • добавить условие:

    else {    
        //check for this condition, otherwise for i=0 you will have an exception 
        if (i>0) { 
         Double lati=c1.getDouble(2); 
         Double longi=c1.getDouble(3); 
         myTargetLocation.setLatitude(lati); 
         myTargetLocation.setLongitude(longi); 
         dis[i]=(int) mySourceLocation.distanceTo(myTargetLocation); 
         disbetween[i]=dis[i]-dis[i-1]; 
         distancelist.add(disbetween[i].toString()); 
         Toast.makeText(getApplicationContext(),longi+" "+lati+" "+disbetween[i], 1).show(); 
        } 
        else { 
         //handle the situation if i < 0 
        } 
    } 
    
  • множество б ложь где-то еще, а второй еще условие

  • реструктурировать ваше состояние в целом

Как сказал, ты тот, кто знает, что вы хотите сделать, так что вы должны быть в состоянии работать решение прямо сейчас.

1

Начинаешь значение переменной I от 0, и использовать эту строку:

disbetween[i]=dis[i]-dis[i-1]; 

Таким образом, вы индексировать Дис массив с -1