> Java > java지도 시간 > `Executor`를 사용할 때 `Future` 및 `SwingWorker`에서 `ArrayIndexOutOfBoundsException`을 포착할 수 없는 이유는 무엇입니까?

`Executor`를 사용할 때 `Future` 및 `SwingWorker`에서 `ArrayIndexOutOfBoundsException`을 포착할 수 없는 이유는 무엇입니까?

Patricia Arquette
풀어 주다: 2024-12-17 01:12:24
원래의
465명이 탐색했습니다.

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

스레드가 Executor를 시작하는 경우 Future 및 SwingWorker에서 ArrayIndexOutOfBoundsException을 잡을 수 없습니다.

문제:
저는 Executor를 사용하고 있습니다. SwingWorker는 다중 스레드일 때 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));
    }

    // ... 代码 ...
}
로그인 후 복사

편집:
by in Future#get()의 done() 메서드에 예외 다시 던지는 기능을 추가했습니다(훌륭한 제안을 주신 @takteek에게 감사드립니다).

@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();
        }
    }
로그인 후 복사

하지만 출력은 여전히 ​​다음과 같습니다:

运行:
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿