ArrayIndexOutOfBound исключение

Я пытаюсь синхронизировать задачи Google с моим приложением. Для этого я создал класс, в котором я создал все методы, необходимые для получения списков задач, создания списка и т. Д.

Теперь я хочу проверить, работают ли эти методы или нет. Для этого я создал класс, который расширяет AsyncTask,

Я должен передать некоторые параметры в этой задаче, так как в методах у меня есть параметры. Как в getTaskList(Strig listId), Чтобы получить задачи из любого списка, мне нужно будет указать идентификатор списка.

Теперь, когда я пытался передать параметры в AsyncTask. Пока звоню в

result = gTaskSyncer.getTaskList(params[0].toString());

его бросать ArrayIndexOutOfBoundException Вот.

TestAsyncTask

 public class TestAsyncTask extends AsyncTask<Object,Void,List<Task>>{

    private com.google.api.services.tasks.Tasks mService = null;
    private Exception mLastError = null;
    private MainActivity activity;
    private com.google.api.services.tasks.Tasks client = null;

    public TestAsyncTask(GoogleAccountCredential credential, MainActivity activity) {
        HttpTransport transport = AndroidHttp.newCompatibleTransport();
        JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
        mService = new com.google.api.services.tasks.Tasks.Builder(
                transport, jsonFactory, credential)
                .setApplicationName("Google Tasks API Android Quickstart")
                .build();
        this.activity = activity;
    }

    protected List<Task> doInBackground(Object... params) {



        GTaskSyncer gTaskSyncer = new GTaskSyncer(activity);

        List<Task> result = new ArrayList<>();

        try {

            result = gTaskSyncer.getTaskList(params[0].toString());

        } catch (IOException e) {

            Handler handler = new Handler(Looper.getMainLooper());
            handler.post(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(activity, "No tasks.", Toast.LENGTH_SHORT).show();
                }
            });

        }
        return result;
    }


    @Override
    protected void onPostExecute(List<Task> output) {
        activity.mProgress.hide();
        if (output == null || output.size() == 0) {
            activity.mOutputText.setText("No results returned.");
        } else {
            activity.mOutputText.setText(TextUtils.join("\n", output));
        }
    }
}

GTaskSyncer

 public class GTaskSyncer
{

    final MainActivity activity;
    final com.google.api.services.tasks.Tasks mService;
    private Exception mLastError = null;



    GTaskSyncer(MainActivity activity) {
        this.activity = activity;
        mService = activity.mService;
    }

    public List<TaskList> getAllTaskList() throws IOException
    {
        List<TaskList> result = new ArrayList<TaskList>();

        TaskLists taskLists = mService.tasklists().list().execute();

        for (TaskList taskList : taskLists.getItems()) {

                result.add(taskList);
        }

        return result;

    }


    public TaskList createList() throws IOException
    {

        TaskList taskList = new TaskList();

        taskList =  activity.mService.tasklists().insert(taskList).execute();

        return taskList;
    }

    public Task createTask(String listId) throws IOException
    {

        Task task = new Task();

        task =   activity.mService.tasks().insert(listId, task).execute();

        return  task;
    }

    public Task getTask(String listId,String taskId) throws IOException
    {

        Task task =   activity.mService.tasks().get(listId, taskId).execute();

        return task;
    }

    public List<Task> getTaskList(String listId) throws IOException {


        List<Task> result = new ArrayList<Task>();

        List<Task> tasks = mService.tasks().list(listId).execute().getItems();

        if (tasks != null) {

            for (Task task : tasks) {

                result.add(task);
            }
        } else {

            Toast.makeText(activity, "No tasks.", Toast.LENGTH_SHORT).show();
        }

        return result;

    }

}

И как я могу это проверить? Как предоставить метод listId при вызове?

3 ответа

Решение

Исключение для массива вне границ - это исключение Java, вызванное тем, что программа пытается получить доступ к элементу в позиции, которая находится за пределами предела массива, отсюда и слова "вне границ".

проблема

 result = gTaskSyncer.getTaskList(params[0].toString()); // In here Problem 

Брошенный, чтобы указать, что к массиву обращались с недопустимым индексом. Индекс либо отрицательный, либо больше или равен размеру массива.

  • Я полагаю, в вашем doInBackground Результатом раздела является недопустимый индекс.

Когда вы вызываете execute() на AsyncTask без каких-либо аргументов этот отсутствующий аргумент для execute() становится пустым массивом (varargs) в AsyncTask doInBackground() метод.

Если вы хотите иметь возможность использовать параметры в doInBackground(), то вы должны передать некоторые параметры через execute(), Если вы хотите убедиться, что вы не индексируете список элементов, переданных в execute, выполняйте итерацию массива vararg arg, а не индексируйте непосредственно в него, не проверяя его длину.

Сначала убедитесь, что вы передаете значение при вызове класса Asynctask. ArrayIndexOutOfBoundException происходит потому, что вы не проходите мимо, но хотите получить к нему доступ.

Поэтому, прежде чем получить доступ к этому параметру, сначала проверьте, что если размер больше 1.

Другие вопросы по тегам