ArrayList上发生java.lang.IndexOutOfBoundsException

ArrayList上发生java.lang.IndexOutOfBoundsException,java,android,Java,Android,您刚刚声明了列表,其中还没有任何元素 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.don

您刚刚声明了
列表
,其中还没有任何元素

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)
CopyOnWriteArrayList选项=新建CopyOnWriteArrayList();
您正在尝试从
列表中
获取()
,但不包含任何元素
ArrayList
内部将使用数组缓冲区存储元素。根据Javadoc:

抛出:

IndexOutOfBoundsException-如果索引超出范围(索引<0 | |索引>=size())


因此
Options.get(selectedFilterIndex)
仅适用于
(selectedFilterIndex>-1和&selectedFilterIndex

您不应该处理此异常-您应该编写一开始不会导致此异常的代码

您刚刚创建了一个空列表-没有可以传递给
get
的值,它将返回一个值。该列表的大小为0,索引应大于或等于0,并严格小于该大小

此外,如果遵循Java命名约定,使变量
camelCased
,那么代码的阅读就会简单得多,这将避免变量和类型的名称相同。还要避免两次使用相同的变量名

CopyOnWriteArrayList<Options> Options= new CopyOnWriteArrayList<Options>();
CopyOnWriteArrayList allOptions=new CopyOnWriteArrayList();
//对于selectedFilterIndex的任何值,此操作仍将失败,如列表所示
//是空的。。。但至少它更容易理解。
Options selectedOptions=allOptions.get(selectedFilterIndex);

您是否检查了selectedFilterIndex@VaibhavRaj,因为
options.size()
为0。列表为空。那么,很明显,您将得到此错误。因为,您的列表大小为零,并且您正在尝试访问大于0的索引。您可能希望建议遵循以下Java命名约定。
CopyOnWriteArrayList<Options> Options= new CopyOnWriteArrayList<Options>();
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);