ArrayIndexOutOfBoundsException von Future> kann nicht abgefangen werden, wenn der Thread Executor startet
Problem:
Ich verwende Executor für SwingWorker identifiziert bei Multithreading fälschlicherweise die falschen Elemente aus einem Vektor. Es sieht so aus, als würde dieser Code eher Elemente ignorieren, die im Vektor nicht vorhanden sind.
Problemdetails:
Problemausgabe:
运行: 线程状态,名称:StartShedule,SwingWorker 状态为 STARTED 线程状态,名称:StartShedule,SwingWorker 状态为 DONE 线程状态,名称:StartShedule,SwingWorker 状态为 STARTED 线程状态,名称:StartShedule,SwingWorker 状态为 DONE 线程状态,名称:StartShedule,SwingWorker 状态为 STARTED 线程状态,名称:StartShedule,SwingWorker 状态为 DONE 构建成功(总时间:11 秒)
Ausnahme ausgelöst durch Auskommentieren des folgenden Codes:
// 更改 TableValues1(); // 取消注释以获取 ArrayIndexOutOfBoundsException
Geänderte Ausgabe:
运行: 线程“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 秒)
Codeausschnitt:
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)); } // ... 代码 ... }
Bearbeiten:
von in Ich habe das erneute Auslösen von Ausnahmen in der Methode done() in Future#get() hinzugefügt (danke an @takteek für den tollen Vorschlag).
@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(); } }
Aber die Ausgabe ist immer noch nur:
运行: 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 秒)
Das obige ist der detaillierte Inhalt vonWarum kann ich eine „ArrayIndexOutOfBoundsException' von einem „Future' und „SwingWorker' nicht abfangen, wenn ich einen „Executor' verwende?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!