簡體   English   中英

ArrayList上發生java.lang.IndexOutOfBoundsException

[英]java.lang.IndexOutOfBoundsException occuring on ArrayList

CopyOnWriteArrayList<Options> Options= new CopyOnWriteArrayList<Options>();
Options Options = Options.get(selectedFilterIndex);

我在上面的行中得到錯誤。 選項是一個ArrayList。 我嘗試使用ArrayList以及CopyOnWriteArrayList ,但收到以下錯誤。 如何處理此類異常。

 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) 

您不應該處理此異常-您應該編寫最初不會引起該異常的代碼。

您剛剛創建了一個空列表-有沒有價值,你可以通到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);

您剛剛聲明了List ,但其中沒有任何元素。

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

而且您正在嘗試從List get()沒有元素的get() ArrayList內部將使用數組緩沖區存儲元素。 根據Javadoc get(int index)

拋出:

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

因此, Options.get(selectedFilterIndex); 僅適用於(selectedFilterIndex>-1 && selectedFilterIndex < Options.size())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM