Java Android列表视图数组索引越界异常

Java Android列表视图数组索引越界异常,java,android,Java,Android,我已经编写了一个函数来计算距离,并在列表视图的文本视图中进行反射。现在,这将给出数组索引越界异常。这里可能有什么毛病。?因为代码的其余部分以前用于给出结果,但在添加此函数后,此应用程序正在崩溃 Route.java public class Route extends Activity { ImageView exit, home, liveview, pinmap; ArrayList<String> tolist; ArrayList<String> dist

我已经编写了一个函数来计算距离,并在列表视图的文本视图中进行反射。现在,这将给出数组索引越界异常。这里可能有什么毛病。?因为代码的其余部分以前用于给出结果,但在添加此函数后,此应用程序正在崩溃

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

从0开始变量i,并使用此行:

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

因此,在distanceBetweeInstances()方法中,使用-1对dis数组进行索引,在else部分中有这一行:

disbetween[i]=dis[i]-dis[i-1];
这将产生ArrayIndexOutOfBoundsException。为什么?

在方法中,创建光标:

Cursor c1=mdb.getStops(tolist.get(i));
并启动while()循环:

如果游标中有超过1行,在第一次迭代中,第一个条件得到满足(因为b为true),所以有问题的行还不会运行。但是您将b设置为false,因此在第二行,调用else部分,记住i仍然是0,您有:

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

disbetween[0]=dis[0]-dis[-1];请发布stacktrace并发布。你能检查tolist中的项目数吗请使用更新的ques,logcat在那里。在创建tolist之前,应用程序正在崩溃。你能粘贴stacktrace而不是图片并完成代码RouteList.xml吗?
disbetween[i]=dis[i]-dis[i-1];
Cursor c1=mdb.getStops(tolist.get(i));
 while(c1.moveToNext()) {
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
    }
}