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.