TimetableMainActivity$GetXML.onPostExecute 处的 java.lang.IndexOutOfBoundsException

标签 java indexing bounds out

我的代码有问题。我将数据从一个 Activity 传递到另一个 Activity ,没有任何问题,但是当我尝试显示我从微调器中选择的时间表时,它给了我一个索引越界异常

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.sql.Time;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
import android.app.AlertDialog;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.AsyncTask;
import android.os.Bundle;
import android.graphics.Color;
import android.support.v4.view.PagerTabStrip;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;

public class TimetableMainActivity extends AppCompatActivity {

final String[] page_titles = new String[]{"Mon", "Tue", "Wed", "Thu", "Fri"};

final String[] hours = new String[]{"9", "10", "11", "noon", "1", "2", "3", "4", "5", "6"};

private String[][] days;
private int pos;
private String source = null;

public static ArrayList<String> schedule = new ArrayList<String>();

List<Map<String, String>>[] list = new List[5]; // Mon - Fri
Map<String, String> map;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (!isNetworkAvailable())
        new AlertDialog.Builder(TimetableMainActivity.this).
                setTitle("Error").setMessage("No Network Connection").
                setNeutralButton("Close", null).show();
    else {
        new GetXML().execute("");
    }
}

public boolean isNetworkAvailable() {
    ConnectivityManager cm = (ConnectivityManager)
            getSystemService(Context.CONNECTIVITY_SERVICE);

    NetworkInfo networkInfo = cm.getActiveNetworkInfo();

    if (networkInfo != null && networkInfo.isConnected())
        return true;
    else
        return false;
}

private class GetXML extends AsyncTask<String, Void, String> {
    String src = null;

    @Override
    protected String doInBackground(String... params) {
        Bundle extras = getIntent().getExtras();
        source = extras.getString("Name");
        try {
            URL url = new URL(source);
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            src = readStream(con.getInputStream());

        } catch (Exception e) {
            e.printStackTrace();
        }

        return src;
    }

    @Override
    protected void onPostExecute(String result) {
        if (src == null)
            new AlertDialog.Builder(TimetableMainActivity.this).
                    setTitle("Error").setMessage("No Schedule Found").
                    setNeutralButton("Close", null).show();
        else parseXML(src);

        setContentView(R.layout.activity_main_timetable);


            days = new String[5][10];
            for (int i = 0; i < 5; i++) {
                for (int j = 0; j < 10; j++) {
                    int k = i * 10 + j;
                    days[i][j] = schedule.get(k);
                }
            }


        for (int i = 0; i < 5; i++)
            list[i] = new ArrayList<Map<String, String>>();

        int count = hours.length;

        for (int j = 0; j < 5; j++) {
            for (int i = 0; i < count; i++) {
                map = new HashMap<String, String>();
                map.put("time", hours[i]);
                map.put("description", days[j][i]);
                list[j].add(map);
            }
        }

        Calendar cal = Calendar.getInstance();
        int today = cal.get(Calendar.DAY_OF_WEEK) - 2;

        pos = 0;
        if (today >= 0 && today <= 4)
            pos = today;

        ViewPager viewPager = findViewById(R.id.ViewPager);
        CustomPagerAdapter adapter = new CustomPagerAdapter(TimetableMainActivity.this, list);
        PagerTabStrip pagerTabStrip = findViewById(R.id.pager_tab);

        int color = Color.parseColor("#33b7ee");
        pagerTabStrip.setTabIndicatorColor(color);

        viewPager.setAdapter(adapter);
        viewPager.setCurrentItem(pos);
    }

    @Override
    protected void onPreExecute() {
    }

    @Override
    protected void onProgressUpdate(Void... values) {
    }
}

public void parseXML(String src) {
    try {
        StringReader sr = new StringReader(src);
        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
        factory.setNamespaceAware(true);
        XmlPullParser xpp = factory.newPullParser();
        xpp.setInput(sr);

        int token = xpp.getEventType();
        while (token != XmlPullParser.END_DOCUMENT) {
            if (token == XmlPullParser.START_TAG) {
                if (xpp.getName().equals("cid")) {
                    token = xpp.nextToken();

                    if (xpp.getText() == null)
                        schedule.add("");

                    if (token == XmlPullParser.TEXT) {
                        schedule.add(xpp.getText());
                    }
                }
            }

            token = xpp.nextToken();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

private String readStream(InputStream in) {
    BufferedReader reader = null;
    String line = null;
    StringBuffer sb = new StringBuffer();
    try {
        reader = new BufferedReader(new InputStreamReader(in));
        while ((line = reader.readLine()) != null) {
            sb.append(line);
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (reader != null) {
            try {
                reader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    return sb.toString();
}

这是从第一个 Activity 传递数据的第二个 Activity ,位于此处:

public class ScheduleMainActivity extends AppCompatActivity {

final static String[] programs = { "Select Program", "Architectural",
        "Civil", "Geomatics", "Computing Systems", "Biomedical",
        "Instrumentation", "Electrical (Power)",
        "Telecommunications", "Chemical Processing", "Industrial", "Mechanical",
        "Manufacturing", "Petroleum" };

final static String[] years = { "Select Year", "First", "Second", "Third" };

String p = new String();
String y = new String();
String cid = new String();
String loc = new String();



@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main_schedule);

    Spinner spinner_p = (Spinner) findViewById(R.id.spinner_p);
    ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(ScheduleMainActivity.this,
            R.layout.spinnerrow, R.id.spinner_id, programs);
    spinner_p.setAdapter(arrayAdapter);

    spinner_p.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

        public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
            switch(pos) {
                case 1 : cid = "ae"; break;
                case 2 : cid = "ce"; break;
                case 3 : cid = "ge"; break;
                case 4 : cid = "cs"; break;
                case 5 : cid = "eb"; break;
                case 6 : cid = "ei"; break;
                case 7 : cid = "ep"; break;
                case 8 : cid = "te"; break;
                case 9 : cid = "cp"; break;
                case 10: cid = "in"; break;
                case 11: cid = "me"; break;
                case 12: cid = "mm"; break;
                case 13: cid = "pe"; break;
                default: break;
            }
            p = programs[pos];
        }

        public void onNothingSelected(AdapterView<?> parent) {
        }
    });

    Spinner spinner_y = (Spinner) findViewById(R.id.spinner_y);
    ArrayAdapter<String> y_arrayAdapter = new ArrayAdapter<String>(ScheduleMainActivity.this,
            R.layout.spinnerrow, R.id.spinner_id, years);
    spinner_y.setAdapter(y_arrayAdapter);

    spinner_y.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

        public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
            y = years[pos];
        }

        public void onNothingSelected(AdapterView<?> parent) {
        }
    });

    final Button b = (Button) findViewById(R.id.schedule);

    b.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if(v == b) {
                if(event.getAction() == MotionEvent.ACTION_DOWN) {
                    v.setAlpha(.3f);
                }
                else {
                    v.setAlpha(1f);
                }
            }
            return false;
        }
    });

    b.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View arg0) {
            if(p.equals("Select Program") || y.equals("Select Year"))
                new AlertDialog.Builder(ScheduleMainActivity.this).
                        setTitle("Error").setMessage("No Program/Year selected").
                        setNeutralButton("Close", null).show();
            else {
                Calendar cal = Calendar.getInstance();
                SimpleDateFormat monthFormat = new SimpleDateFormat("M");
                String month_name = monthFormat.format(cal.getTime());

                int month = Integer.parseInt(month_name);
                int selectedYear = 0;

                if(y.equals("First"))
                    selectedYear = 1;
                else if(y.equals("Second"))
                    selectedYear = 2;
                else if(y.equals("Third"))
                    selectedYear = 3;

                int semester = 0;
                if(month >= 9 && month <= 12) {
                    semester = 3 * selectedYear - 2;
                }
                else if(month >= 1 && month <= 4) {
                    semester = 3 * selectedYear - 1;
                }
                else {
                    semester = 3 * selectedYear;
                }

                StringBuffer sb = new StringBuffer();
                sb.append("http://branko-cirovic.appspot.com/etcapp/timetables/timetable_"); sb.append(cid); sb.append(semester); sb.append(".xml");
                loc = sb.toString();

                Toast.makeText(ScheduleMainActivity.this,"You Selected : "
                        + loc, Toast.LENGTH_SHORT).show();

                Intent intent = new Intent(ScheduleMainActivity.this, TimetableMainActivity.class);
                intent.putExtra("Name", loc);
                startActivity(intent);

            }
        }
    });

}

}

如果有人可以解决我的问题或告诉我如何解决它,我将不胜感激

最佳答案

所以问题实际上是我试图传递给第二个 Activity 的 URL,这是错误的。

通过将“Bundle extras”放入第二个 Activity 的 try 语句中,我现在已经可以正常工作了

关于TimetableMainActivity$GetXML.onPostExecute 处的 java.lang.IndexOutOfBoundsException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53550525/

相关文章:

java - 任务 com.google.firebase.a.v 被 java.util.concurrent.ThreadPoolExecutor 拒绝

sql-server - 为什么这次加入需要这么长时间?

mysql - 空间索引减慢查询mysql

ios - 使用另一个 UIImageView 的 UIImageViews 坐标范围

C++ 字符串溢出

java - 如何在 Mac 上的 IntelliJ 中输入倒置的问号?

java - 如何短路 Stream 上的 reduce() 操作?

ios - 关于从 UIView 派生的自定义类的边界/框架的问题

java - Spring MVC。为什么 JSP 页面看不到资源?

mysql - "SELECT...WHERE 1"是否停止 MySQL 使用索引?