Android 应用中的索引越界异常

Index out of bound exception in Android app

您好,在我的 android 应用程序中,我需要根据日期在列表视图中显示一些详细信息。当您打开应用程序时,它会获取最近十天的数据并显示出来。这个应用程序在几天前运行良好,但现在它显示了一些致命的异常,我仔细检查了我的代码,我找不到任何错误。

错误是

02-09 12:37:11.399: E/AndroidRuntime(25430): FATAL EXCEPTION: main
02-09 12:37:11.399: E/AndroidRuntime(25430): Process: com.imaginet.everwinmatriculation, PID: 25430
02-09 12:37:11.399: E/AndroidRuntime(25430): java.lang.StringIndexOutOfBoundsException: length=802; regionStart=306; regionLength=-277
02-09 12:37:11.399: E/AndroidRuntime(25430):    at java.lang.String.startEndAndLength(String.java:504)
02-09 12:37:11.399: E/AndroidRuntime(25430):    at java.lang.String.substring(String.java:1333)
02-09 12:37:11.399: E/AndroidRuntime(25430):    at com.imaginet.everwinmatriculation.EventsFragment.onResponse(EventsFragment.java:284)
02-09 12:37:11.399: E/AndroidRuntime(25430):    at com.imaginet.everwinmatriculation.EventsFragment.onResponse(EventsFragment.java:1)
02-09 12:37:11.399: E/AndroidRuntime(25430):    at com.android.volley.toolbox.JsonRequest.deliverResponse(JsonRequest.java:65)
02-09 12:37:11.399: E/AndroidRuntime(25430):    at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:99)
02-09 12:37:11.399: E/AndroidRuntime(25430):    at android.os.Handler.handleCallback(Handler.java:739)
02-09 12:37:11.399: E/AndroidRuntime(25430):    at android.os.Handler.dispatchMessage(Handler.java:95)
02-09 12:37:11.399: E/AndroidRuntime(25430):    at android.os.Looper.loop(Looper.java:135)
02-09 12:37:11.399: E/AndroidRuntime(25430):    at android.app.ActivityThread.main(ActivityThread.java:5312)
02-09 12:37:11.399: E/AndroidRuntime(25430):    at java.lang.reflect.Method.invoke(Native Method)
02-09 12:37:11.399: E/AndroidRuntime(25430):    at java.lang.reflect.Method.invoke(Method.java:372)
02-09 12:37:11.399: E/AndroidRuntime(25430):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
02-09 12:37:11.399: E/AndroidRuntime(25430):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)

代码是:

public class EventsFragment extends Fragment {

public EventsFragment(){}

Button btn1;
// Log tag
private static final String TAG = EventsFragment.class.getSimpleName();

private ProgressDialog pDialog;

private List<ExternalEvents> movieList = new ArrayList<ExternalEvents>();
private List<ExternalEvents> newlistfordescrip = new    ArrayList<ExternalEvents>();
private ListView listView;
private CustomListAdapter adapter;
TextView txt;
ImageButton fmdate,tddate;
static String fdate,tdate;
public static final String INDEX = "event_details";
EditText fromdate,todate;

final Calendar c = Calendar.getInstance();
int mYear = c.get(Calendar.YEAR);
int mMonth = c.get(Calendar.MONTH);
int mDay = c.get(Calendar.DAY_OF_MONTH);

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    View rootView = inflater.inflate(R.layout.fragment_events, container, false);

    return rootView;
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onActivityCreated(savedInstanceState);

    fromdate=(EditText)getActivity().findViewById(R.id.editText1);
    todate=(EditText)getActivity().findViewById(R.id.editText2);

    fmdate=(ImageButton) getActivity().findViewById(R.id.imageButton1);
    tddate=(ImageButton) getActivity().findViewById(R.id.imageButton2);

    showprograssdialog();
    jsonReqOnStartUp();

    fmdate.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener() {

                public void onDateSet(DatePicker view, int year,
                        int monthOfYear, int dayOfMonth) {

                    mDay = dayOfMonth;
                    mMonth = monthOfYear;
                    mYear = year;

                    updateDisplay();
                }

                private void updateDisplay() {
                    // TODO Auto-generated method stub
                    GregorianCalendar c = new GregorianCalendar(mYear, mMonth, mDay);
                    SimpleDateFormat sdf = new SimpleDateFormat("dd MMMM yyyy");

                    fromdate.setText(sdf.format(c.getTime()));

                    sdf = new SimpleDateFormat("dd-MM-yyyy");

                    fdate=sdf.format(c.getTime());
                }
            };

            DatePickerDialog d = new DatePickerDialog(getActivity(),
                    mDateSetListener, mYear, mMonth, mDay);
            d.getDatePicker().setMaxDate(System.currentTimeMillis()-1000);
            d.show();

        }
    });

    tddate.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener() {

                public void onDateSet(DatePicker view, int year,
                        int monthOfYear, int dayOfMonth) {

                    mDay = dayOfMonth;
                    mMonth = monthOfYear;
                    mYear = year;

                    updateDisplay();
                }

                private void updateDisplay() {
                    // TODO Auto-generated method stub
                    GregorianCalendar c = new GregorianCalendar(mYear, mMonth, mDay);
                    SimpleDateFormat sdf = new SimpleDateFormat("dd MMMM yyyy");

                    todate.setText(sdf.format(c.getTime()));

                    sdf = new SimpleDateFormat("dd-MM-yyyy");

                    tdate=sdf.format(c.getTime());

                }
            };

            DatePickerDialog d = new DatePickerDialog(getActivity(),
                    mDateSetListener, mYear, mMonth, mDay);
            d.getDatePicker().setMaxDate(System.currentTimeMillis()-1000);

            d.show();

        }
    });
    listView = (ListView) getActivity().findViewById(R.id.list);
    adapter = new CustomListAdapter(getActivity(), movieList);
    listView.setAdapter(adapter);

    btn1 = (Button) getActivity().findViewById(R.id.button1);
    btn1.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

            if(tdate==null)
            {
                Toast.makeText(getActivity(), "To Date Cannot be empty Please set it", Toast.LENGTH_LONG).show();
            }
            if(fdate==null)
            {
                Toast.makeText(getActivity(), "From Date Cannot be empty Please set it", Toast.LENGTH_LONG).show();
            }
            if(fdate == tdate)
            {
                Toast.makeText(getActivity(), "From and To date cannot be same", Toast.LENGTH_LONG).show();
            }
            if((fdate!=null)&&(tdate!=null)&&(fdate!=tdate))
            {
                movieList.clear();
                newlistfordescrip.clear();
                showprograssdialog();
                makeJsonObjectRequest();
            }
        }
    });

    listView.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,
                long id) {
            // TODO Auto-generated method stub
            String desc, tagDesc;
            ExternalEvents m = movieList.get(position);
            ExternalEvents n = newlistfordescrip.get(position);
            desc=m.getdescription();
            tagDesc=n.getdescription();

            // Starting single contact activity
            Intent in = new Intent(getActivity(),Eventsdisplay.class);

            in.putExtra("eventdetails", m.getevent_details());
            in.putExtra("date", m.getdate());
            in.putExtra("description", n.getdescription());
            if(m.getThumbnailUrl().get(0) != null)
            {
                in.putExtra("imageval", "notnull");
                Bundle bundleObject = new Bundle(); 
                bundleObject.putSerializable("image",m.getThumbnailUrl());
                in.putExtras(bundleObject);
            }
            else
            {
                in.putExtra("imageval", "null");
            }
            startActivity(in);
        }
    });

    // changing action bar color
    getActivity().getActionBar().setBackgroundDrawable(
            new ColorDrawable(Color.parseColor("#1b1b1b")));
}

void jsonReqOnStartUp(){
    Calendar fDateload=new GregorianCalendar(mYear,mMonth,mDay-30);
    Calendar tDateload=new GregorianCalendar(mYear,mMonth,mDay);    
    SimpleDateFormat sdf= new SimpleDateFormat("dd-MM-yyyy");

    String  tdateld=sdf.format(tDateload.getTime());
    String  fdateld=sdf.format(fDateload.getTime());
    String url ="http://matric.everwinschool.in/webservice/rest/?module=internalevents&from="+fdateld+"&to="+tdateld;
    url = url.replaceAll(" ", "%20");

    // Creating volley request obj
    JsonObjectRequest jsonObjReq = new JsonObjectRequest(Method.GET,

            url, null, new Response.Listener<JSONObject>() {

        @Override
        public void onResponse(JSONObject response) {
            // TODO Auto-generated method stub
            //showpDialog();
            JSONArray value;
            try {
                value = response.getJSONArray("Internal Events");

                for (int i = 0; i < value.length(); i++)
                {
                    JSONObject obj = value.getJSONObject(i);
                    JSONObject objOther = value.getJSONObject(i);

                    ExternalEvents events = new ExternalEvents();
                    ExternalEvents tagEvents = new ExternalEvents();
                    tagEvents.setdescription(obj.getString("description"));

                    events.setevent_detils(obj.getString("event_details"));
                    events.setdate(obj.getString("date"));
                    tagEvents.setdescription(obj.getString("description"));
                    String strDescrip =  obj.getString("description");

                    while(strDescrip.contains("&"))
                        strDescrip = strDescrip.replace(strDescrip.substring(strDescrip.indexOf("&"),strDescrip.indexOf(";")+1),"");
                    while(strDescrip.contains("<"))
                        strDescrip = strDescrip.replace(strDescrip.substring(strDescrip.indexOf("<"),strDescrip.indexOf(">")+1),"");
                    events.setdescription(strDescrip);

                    String str=obj.getString("image");
                    if(str.equalsIgnoreCase("null"))
                    {
                        events.setThumbnailUrl(0,null);
                    }
                    else
                    {
                        String[] mArray = str.split(",");

                        for(int j=0;j<mArray.length;j++)
                        {
                            events.setThumbnailUrl(j, mArray[j]);
                        }
                        mArray=null;
                    }

                    //Adding movie to movies array
                    movieList.add(events);
                    newlistfordescrip.add(tagEvents);
                }   
                hidePDialog();
            } catch (JSONException e) {
                e.printStackTrace();
            }

            // notifying list adapter about data changes
            // so that it renders the list view with updated data
            adapter.notifyDataSetChanged();
        }

    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            VolleyLog.d(TAG, "Error: " + error.getMessage());
            Toast.makeText(getActivity(), "Unable to fetch data", Toast.LENGTH_LONG).show();
            hidePDialog();

        }
    });

    // Adding request to request queue
    AppController.getInstance().addToRequestQueue(jsonObjReq);  
}
protected void makeJsonObjectRequest() {
    // TODO Auto-generated method stub
    String url ="http://matric.everwinschool.in/webservice/rest/?module=internalevents&from="+fdate+ "&to=" +tdate;
    url = url.replaceAll(" ", "%20");

    // Creating volley request obj
    JsonObjectRequest jsonObjReq = new JsonObjectRequest(Method.GET,

            url, null, new Response.Listener<JSONObject>() {

        @Override
        public void onResponse(JSONObject response) {
            // TODO Auto-generated method stub
            //showpDialog();
            JSONArray value;
            try {
                value = response.getJSONArray("Internal Events");


                for (int i = 0; i < value.length(); i++)
                {
                    JSONObject obj = value.getJSONObject(i);
                    JSONObject objOther = value.getJSONObject(i);

                    ExternalEvents events = new ExternalEvents();
                    ExternalEvents tagEvents = new ExternalEvents();
                    tagEvents.setdescription(obj.getString("description"));

                    events.setevent_detils(obj.getString("event_details"));
                    events.setdate(obj.getString("date"));
                    tagEvents.setdescription(obj.getString("description"));
                    String strDescrip =  obj.getString("description");

                    while(strDescrip.contains("&"))
                        strDescrip = strDescrip.replace(strDescrip.substring(strDescrip.indexOf("&"),strDescrip.indexOf(";")+1),"");
                    while(strDescrip.contains("<"))
                        strDescrip = strDescrip.replace(strDescrip.substring(strDescrip.indexOf("<"),strDescrip.indexOf(">")+1),"");

                    events.setdescription(strDescrip);

                    String str=obj.getString("image");

                    String[] mArray = str.split(",");

                    for(int j=0;j<mArray.length;j++)
                    {
                        events.setThumbnailUrl(j, mArray[j]);
                    }
                    mArray=null;
                    // adding movie to movies array
                    movieList.add(events);
                    //String stradd = obj.getString("description");
                    newlistfordescrip.add(tagEvents);
                }   
                hidePDialog();
            } catch (JSONException e) {
                e.printStackTrace();
            }

            // notifying list adapter about data changes
            // so that it renders the list view with updated data
            adapter.notifyDataSetChanged();
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            VolleyLog.d(TAG, "Error: " + error.getMessage());
            Toast.makeText(getActivity(), "Unable to fetch data", Toast.LENGTH_LONG).show();
            hidePDialog();
        }
    });

    // Adding request to request queue
    AppController.getInstance().addToRequestQueue(jsonObjReq);  
}

private void showprograssdialog() {
    // TODO Auto-generated method stub
    pDialog = new ProgressDialog(getActivity());
    pDialog.setMessage("Please wait...");
    //  pDialog.setCancelable(false);
    pDialog.show();
}

protected void hidePDialog() {
    // TODO Auto-generated method stub

    if (pDialog != null) {
        pDialog.dismiss();
        pDialog = null;
    }
}

}

行中

while(strDescrip.contains("&"))
                    strDescrip = strDescrip.replace(strDescrip.substring(strDescrip.indexOf("&"),strDescrip.indexOf(";")+1),"");
while(strDescrip.contains("<"))
                    strDescrip = strDescrip.replace(strDescrip.substring(strDescrip.indexOf("<"),strDescrip.indexOf(">")+1),"");

你检查strDescrip.contains("&")但不检查strDescrip.contains(";"),与<>相同。