Rumah > Java > javaTutorial > Mengapa Saya Tidak Boleh Menangkap `ArrayIndexOutOfBoundsException` daripada `Future` dan `SwingWorker` apabila Menggunakan `Executor`?

Mengapa Saya Tidak Boleh Menangkap `ArrayIndexOutOfBoundsException` daripada `Future` dan `SwingWorker` apabila Menggunakan `Executor`?

Patricia Arquette
Lepaskan: 2024-12-17 01:12:24
asal
555 orang telah melayarinya

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

Tidak dapat menangkap ArrayIndexOutOfBoundsException daripada Future dan SwingWorker jika utas bermula Pelaksana

Masalah: >Saya menggunakan Executor untuk SwingWorker tersilap mengenal pasti elemen yang salah daripada Vektor apabila berbilang benang, nampaknya kod ini agak mengabaikan elemen yang tidak terdapat dalam Vektor.

Butiran masalah:

    Bagaimanakah saya secara tidak sengaja mengabaikan unsur yang tidak wujud dalam Vektor?
  • Bagaimana untuk menangkap pengecualian sedemikian?

Keluaran masalah:

运行:
线程状态,名称:StartShedule,SwingWorker 状态为 STARTED
线程状态,名称:StartShedule,SwingWorker 状态为 DONE
线程状态,名称:StartShedule,SwingWorker 状态为 STARTED
线程状态,名称:StartShedule,SwingWorker 状态为 DONE
线程状态,名称:StartShedule,SwingWorker 状态为 STARTED
线程状态,名称:StartShedule,SwingWorker 状态为 DONE
构建成功(总时间:11 秒)
Salin selepas log masuk

Pengecualian ditimbulkan dengan menyahkomen kod berikut:

// 更改 TableValues1(); // 取消注释以获取 ArrayIndexOutOfBoundsException
Salin selepas log masuk

Output yang diubah suai:

运行:
线程“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 秒)
Salin selepas log masuk

Coretan kod:

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));
    }

    // ... 代码 ...
}
Salin selepas log masuk

Edit: oleh dalam Saya menambah pelempar semula pengecualian dalam kaedah done() dalam Future#get() (terima kasih kepada @takteek atas cadangan yang hebat itu).

@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();
        }
    }
Salin selepas log masuk

Tetapi output masih hanya:

Atas ialah kandungan terperinci Mengapa Saya Tidak Boleh Menangkap `ArrayIndexOutOfBoundsException` daripada `Future` dan `SwingWorker` apabila Menggunakan `Executor`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan