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)