Impossible d'attraper l'exception ArrayIndexOutOfBoundsException de Future> et SwingWorker si le thread démarre Executor
Problème :
J'utilise Executor pour SwingWorker identifie de manière incorrecte les mauvais éléments d'un vecteur lorsqu'il est multithread, il semble que ce code ignore plutôt les éléments qui ne sont pas présents dans le vecteur.
Détails du problème :
Problème de sortie :
运行: 线程状态,名称:StartShedule,SwingWorker 状态为 STARTED 线程状态,名称:StartShedule,SwingWorker 状态为 DONE 线程状态,名称:StartShedule,SwingWorker 状态为 STARTED 线程状态,名称:StartShedule,SwingWorker 状态为 DONE 线程状态,名称:StartShedule,SwingWorker 状态为 STARTED 线程状态,名称:StartShedule,SwingWorker 状态为 DONE 构建成功(总时间:11 秒)
Exception levée en décommentant le code suivant :
// 更改 TableValues1(); // 取消注释以获取 ArrayIndexOutOfBoundsException
Sortie modifiée :
运行: 线程“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 秒)
Extrait de code :
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)); } // ... 代码 ... }
Modifier :
par in J'ai ajouté la relance des exceptions dans la méthode done() dans Future#get() (merci à @takteek pour l'excellente suggestion).
@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(); } }
Mais le résultat est toujours seulement :
运行: 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 秒)
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!