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
465 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!

sumber:php.cn
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