無法從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中文網其他相關文章!