首頁 > Java > java教程 > 為什麼在使用'Executor”時無法從'Future”和'SwingWorker”捕獲'ArrayIndexOutOfBoundsException”?

為什麼在使用'Executor”時無法從'Future”和'SwingWorker”捕獲'ArrayIndexOutOfBoundsException”?

Patricia Arquette
發布: 2024-12-17 01:12:24
原創
464 人瀏覽過

Why Can't I Catch an `ArrayIndexOutOfBoundsException` from a `Future` and `SwingWorker` when Using an `Executor`?

無法從Future> 和SwingWorker 捕獲ArrayIndexOutOfBoundsException,如果執行緒啟動Executor

問題我在使用Executor 進行SwingWorker 多執行緒時,錯誤地從 Vector 識別了錯誤的元素,看起來此程式碼相當忽略了 Vector 中不存在的元素。

問題詳情:

我是如何意外地忽略了 Vector 中不存在的元素的?
  • 如何捕捉此類異常?
問題輸出:

运行:
线程状态,名称:StartShedule,SwingWorker 状态为 STARTED
线程状态,名称:StartShedule,SwingWorker 状态为 DONE
线程状态,名称:StartShedule,SwingWorker 状态为 STARTED
线程状态,名称:StartShedule,SwingWorker 状态为 DONE
线程状态,名称:StartShedule,SwingWorker 状态为 STARTED
线程状态,名称:StartShedule,SwingWorker 状态为 DONE
构建成功(总时间:11 秒)
登入後複製
透過取消註解以下程式碼引發異常:

透過取消註解以下程式碼引發異常:

// 更改 TableValues1(); // 取消注释以获取 ArrayIndexOutOfBoundsException
登入後複製

透過取消註解以下程式碼引發異常:

透過取消註解>
运行:
线程“AWT-EventQueue-0”中出现异常java.lang.ArrayIndexOutOfBoundsException:数组索引超出范围:2
       在 java.util.Vector.get(Vector.java:694)
       在 KondorExport.Util.Help.Table.TableWithExecutor.changeTableValues1(TableWithExecutor.java:70)
       在 KondorExport.Util.Help.Table.TableWithExecutor.access0(TableWithExecutor.java:18)
       在 KondorExport.Util.Help.Table.TableWithExecutor.actionPerformed(TableWithExecutor.java:61)
       在 javax.swing.Timer.fireActionPerformed(Timer.java:271)
       在 javax.swing.Timer$DoPostEvent.run(Timer.java:201)
       在 java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
       在 java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
       在 java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
       在 java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
       在 java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
       在 java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
       在 java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
       在 java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
线程状态,名称:StartShedule,SwingWorker 状态为 STARTED
线程状态,名称:StartShedule,SwingWorker 状态为 DONE
构建成功(总时间:10 秒)
登入後複製
修改後的輸出:

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.List;
import java.util.Vector;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import javax.swing.*;
import javax.swing.table.*;

public class TableWithExecutor extends JFrame {

    // ... 代码 ...

    private void changeTableValues1() {
        fwDeals1 = new Vector<String>();
        fwDeals1.add("First"); // ElementAt(0)
        fwDeals1.add("Second");// ElementAt(1)
        checkDealsInDb1(fwDeals1.get(1), fwDeals1.get(2));
    }

    // ... 代码 ...
}
登入後複製
代碼片段:


編輯:
@Override
    protected void done() {
        try {
            get();
            // errLabel.setText(String.valueOf(get()));
        } catch (InterruptedException ie) {
            ie.printStackTrace();
        } catch (ExecutionException ee) {
            ee.printStackTrace();
        } catch (IllegalStateException is) {
            is.printStackTrace();
        }
    }
登入後複製

透過在done() 方法中重新拋出 Future#get() 中的例外狀況(感謝 @takteek 的出色建議),我加入了重新拋出的內容。

运行:
Got exception
线程状态,名称:StartShedule,SwingWorker 状态为 STARTED
线程状态,名称:StartShedule,SwingWorker 状态为 DONE
Got exception
线程状态,名称:StartShedule,SwingWorker 状态为 STARTED
线程状态,名称:StartShedule,SwingWorker 状态为 DONE
Got exception
线程状态,名称:StartShedule,SwingWorker 状态为 STARTED
线程状态,名称:StartShedule,SwingWorker 状态为 DONE
Got exception
线程状态,名称:StartShedule,SwingWorker 状态为 STARTED
线程状态,名称:StartShedule,SwingWorker 状态为 DONE
构建成功(总时间:13 秒)
登入後複製
但輸出仍只有:

以上是為什麼在使用'Executor”時無法從'Future”和'SwingWorker”捕獲'ArrayIndexOutOfBoundsException”?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板