Java 未来任务中的数组索引超出范围异常

Java 未来任务中的数组索引超出范围异常,java,Java,在以下方法中,我得到一个异常: public static Ticket executeOrder(final FXOrderData orderData) throws Exception { ExecutorService service = Executors.newCachedThreadPool(); Future<Ticket> ticketFuture = service.submit(new Callable<Ticket>()

在以下方法中,我得到一个异常:

public static Ticket executeOrder(final FXOrderData orderData)
      throws Exception {
    ExecutorService service = Executors.newCachedThreadPool();
    Future<Ticket> ticketFuture = service.submit(new Callable<Ticket>() {
      @Override
      public Ticket call() throws Exception {
        try {
          if (isSwap(orderData)) {
            return FXOrderManager.getInstance().executeFXSwapOrder(orderData);
          } else {
            return FXOrderManager.getInstance().executeFXOrder(orderData);
          }
        } catch (final Throwable e) {
          Log.error(getClass().getName(), "executeOrder",
              "Unable to execute order : " + e.getMessage(), e);
          throw new FXMOEException( e.getMessage());
        }
      }
    });

    return ticketFuture.get();
  }
调用此方法时出现问题:

public Ticket executeFXOrder(FXOrderData fxOrderData) throws Throwable {
    validateOrder(fxOrderData);
    // execute non-swap order.

    StrategyInfo strategyInfo = FXStrategyController.getInstance().createStrategy(fxOrderData);
    String strategyID = strategyInfo.getWaveID();
    FXStrategyController.getInstance().startStrategy(strategyInfo);
    String basketId = fxOrderData.getBasketID();

    if (StringUtils.isNullOrWhitespace(basketId)) {
        String symbol = fxOrderData.getSymbol();
        String side = fxOrderData.getSide();
        boolean contra = fxOrderData.isContraTrade();
        String currency = SymbolUtils.getDealCurrency(fxOrderData.getSymbol(), fxOrderData.isContraTrade());

        BasketCollection bc = ZConnection.getBasketStore();
        bc = (BasketCollection) bc.filter(new STBFilter(symbol, side, currency, contra));

        if (bc.size() > 0) {
            basketId = (String) bc.keySet().iterator().next();
        }
    }

    BasketCollection store = ZConnection.getBasketStore();
    Basket basket = store.get(basketId);

    if (basket != null) {
        Wave wave = basket.getWave(strategyID);
        if (wave != null) {
            return (Ticket) wave.getTickets().get(0);
        }
    }
    return null;
}

奇怪的是,它只在运行时发生,而不是在调试时发生。

最类似的异常原因是在最后一节中标记为“由以下原因引起”的代码行中:

这是

Caused by: Array index out of range: 0
    at com.indigo.neuron.gui.manualorderentry.ManualOrderUtils$2.call(ManualOrderUtils.java:141)
    at com.indigo.neuron.gui.manualorderentry.ManualOrderUtils$2.call(ManualOrderUtils.java:1)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
注意:第一个异常只是一个包装异常,表示在哪里捕获并重新捕获了真正的异常


简而言之,总是先读取堆栈跟踪的最后一部分。

如果您试图访问索引
n
处的数组,其中索引
n
大于或等于数组的大小…,或者如果它是负数。只是好奇:您是否计划异步执行此操作?我不明白为什么在提交后等待它完成时,要在单独的线程中执行它?这个问题发生在返回FXOrderManager.getInstance().executeFXOrder(orderData)行;猜测堆栈跟踪指向的位置:
(Ticket)wave.getTickets().get(0)
?是。票证t=null;如果(wave.getTickets().size()!=0){t=(Ticket)wave.getTickets().get(0);}通过此检查解决了pbm问题。但我觉得这不是正确的方法。
Caused by: Array index out of range: 0
    at com.indigo.neuron.gui.manualorderentry.ManualOrderUtils$2.call(ManualOrderUtils.java:141)
    at com.indigo.neuron.gui.manualorderentry.ManualOrderUtils$2.call(ManualOrderUtils.java:1)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)