2013-06-21 4 views
2
CopyOnWriteArrayList<Options> Options= new CopyOnWriteArrayList<Options>(); 
Options Options = Options.get(selectedFilterIndex); 

Я получаю сообщение об ошибке в приведенной выше строке. Параметры - это ArrayList. Я пробовал с ArrayList, а также CopyOnWriteArrayList, но при этом получите следующую ошибку. Как обрабатываются такие исключения.java.lang.IndexOutOfBoundsException, возникающий на ArrayList

06-21 15:28:23.257: E/XXX(8985): Uncaught exception is: 
06-21 15:28:23.257: E/XXX(8985): java.lang.RuntimeException: An error occured while executing doInBackground() 
06-21 15:28:23.257: E/XXX(8985): at android.os.AsyncTask$3.done(AsyncTask.java:278) 
06-21 15:28:23.257: E/XXX(8985): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
06-21 15:28:23.257: E/XXX(8985): at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
06-21 15:28:23.257: E/XXX(8985): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
06-21 15:28:23.257: E/XXX(8985): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
06-21 15:28:23.257: E/XXX(8985): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208) 
06-21 15:28:23.257: E/XXX(8985): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
06-21 15:28:23.257: E/XXX(8985): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
06-21 15:28:23.257: E/XXX(8985): at java.lang.Thread.run(Thread.java:856) 
06-21 15:28:23.257: E/XXX(8985): Caused by: java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0 
06-21 15:28:23.257: E/XXX(8985): at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251) 
06-21 15:28:23.257: E/XXX(8985): at java.util.ArrayList.get(ArrayList.java:304) 
06-21 15:28:23.257: E/XXX(8985): at com.usercontext.CommonActivity$6.doInBackground(AppointmentsActivity5.java:354) 
06-21 15:28:23.257: E/XXX(8985): at com.usercontext.CommonActivity$6.doInBackground(AppointmentsActivity5.java:1) 
06-21 15:28:23.257: E/XXX(8985): at android.os.AsyncTask$2.call(AsyncTask.java:264) 
06-21 15:28:23.257: E/XXX(8985): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
+0

Вы проверили на выбранныйFilterIndex <= options.size(). Я думаю, что selectedFilterIndex растет и становится больше, чем options.size(). –

+0

@VaibhavRaj Это не так, поскольку 'options.size()' is ** 0 **. Список пуст. – Maroun

+1

Тогда, очевидно, что вы получите эту ошибку. Так как ваш список имеет нулевой размер и вы пытаетесь получить доступ к индексной терке, чем 0. –

ответ

5

Вы не должны обрабатывать это исключение - вы должны писать код, который не является в первую очередь.

Вы только что создали пустой список - есть no значение, которое вы можете передать get, которое вернет значение. Список имеет размер 0, а индекс должен быть больше или равен 0 и строго меньше размера.

Кроме того, ваш код будет гораздо проще читать, если вы следовали Java именования зарабатывания переменных camelCased - это позволит избежать с тем же именем как для переменного и типа. Также избегайте использовать одно и то же имя переменной дважды ...

CopyOnWriteArrayList<Options> allOptions = new CopyOnWriteArrayList<Options>(); 
// This will still fail for any value of selectedFilterIndex, as the list 
// is empty... but at least it's easier to understand. 
Options selectedOptions = allOptions.get(selectedFilterIndex); 
1

Вы только что объявили о List, нет никаких элементов в нем пока нет.

CopyOnWriteArrayList<Options> Options= new CopyOnWriteArrayList<Options>(); 

И вы пытаетесь get() от List без каких-либо элементов. ArrayList внутренне использует буфер массива для хранения элементов. Согласно Javadoc get(int index):

Выдает:

IndexOutOfBoundsException - если индекс находится вне диапазона (индекс < 0 || Индекс> = размер())

Следовательно Options.get(selectedFilterIndex); будет работать только для (selectedFilterIndex>-1 && selectedFilterIndex < Options.size())

+0

Возможно, вы захотите проконсультироваться по следующим соглашениям о присвоении имен Java *. – Maroun

+0

Джон уже сделал это. – NINCOMPOOP