簡體   English   中英

遍歷List <Future>對象會拋出IndexOutOfBounds異常

[英]traversing a List<Future> object throws IndexOutOfBounds exception

我有一個ExecutorService,用於調用Callable集合的obejcts,並返回與集合中Callable元素相對應的Future對象List。

但是,在遍歷列表的某個地方,它會引發以下異常:

java.util.concurrent.ExecutionException: java.lang.IndexOutOfBoundsException: Index: 7, Size: 1
at java.util.concurrent.FutureTask.report(Unknown Source)
at java.util.concurrent.FutureTask.get(Unknown Source)
at com.soc.transformcsv.ParallelTransformationPool.doExecute(ParallelTransformationPool.java:91)

我一直在執行的代碼是

List<Future<StringBuilder>> futures = executor.invokeAll(builders);
executor.shutdown();
HashMap<String, List<StringBuilder>> allServiceTypeRows = new LinkedHashMap<>();

for (Future<StringBuilder> future : futures) {
    // I have tried putting future.isDone() which always prints true before the exception
    StringBuilder recordBuilder = future.get();
    // do more
}

它在future.get()行給出了錯誤。

請幫助解決障礙或讓我知道我還提供了什么。

即使Callable中存在異常isDone()的結果也可能為true。 isDone文檔

如果此任務完成,則返回true。 完成可能是由於正常終止,異常或取消 - 在所有這些情況下,此方法將返回true。

所以有問題的未來已經完成,但在計算時遇到了錯誤。 在您發布的堆棧跟蹤下,應該有另一個,列出“由...引起” - 這將導致您的Callable中的根失敗。

例如,請參閱此ideone鏈接的輸出。 成功檢查isDone為true 后會出現此異常:

Exception in thread "main" java.util.concurrent.ExecutionException: java.lang.RuntimeException: This is a failure!
    at java.util.concurrent.FutureTask.report(FutureTask.java:122)
    at java.util.concurrent.FutureTask.get(FutureTask.java:192)
    at Ideone.main(Main.java:16)
Caused by: java.lang.RuntimeException: This is a failure!
    at Ideone$SampleCallable.call(Main.java:21)
    at Ideone$SampleCallable.call(Main.java:19)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at Ideone.main(Main.java:14)

遍歷List<Future>不會發生異常。 實際上,當ExecutorService正在執行Callable (其中一個builders )的call()方法時,會發生IndexOutOfBoundsException

但是,只有當您嘗試使用future.get()獲取Future的結果時,才會拋出此異常(包含在ExecutionException future.get()

暫無
暫無

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

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