-2

我正在处理一个耗时的 for 循环并在 N 个线程中执行它们。continue 语句抛出错误

收到错误“不能在循环外使用继续”

for (final Message m : messagelistholder.getMessage()) {
    Callable<Void> tasksToExecute = new Callable<Void>() {
        public Void call() {


            if (guidanceonly1 == true && !QuoteUtil.isECPQuote(list.get(0))) {
                String msg = "Message From " + m.getSource() + " when retrieving Guidance values: "
                        + m.getDescription();
                String lcladdStatusMessages = CommonUtil.getLoclizedMsg(
                        "PRCE_LNE_ITM_MSG_FRM_WHN_RETRVNG_GUIDNCE_VAL",
                        new String[]{m.getSource(), m.getDescription()}, msg);
                list.get(0).addStatusMessages("Info", lcladdStatusMessages);
            } else if ("Error".equalsIgnoreCase(m.getSeverity())) {
                if (m.getCode().indexOf("_NF") > 0) {
                    continue; // price not found due to private sku
                }
                if ("Eclipse".equalsIgnoreCase(m.getSource())) {
                    String msg1 = "Please check Sold To customer data. ";
                    String lcladdStatusMessages1 = CommonUtil
                            .getLoclizedMsg("PRCE_LNE_ITM_PLS_CHK_SLDTO_CUST_DTA", null, msg1);
                    String msg2 = "Discount information may not be returned from Optimus due to "
                            + m.getSeverity() + " From " + m.getSource() + " " + m.getDescription();
                    String lcladdStatusMessages2 = CommonUtil.getLoclizedMsg(
                            "PRCE_LNE_ITM_DSCNT_INFO_MNT_RTRND_FRM_OPTMS_DUETO_FRM",
                            new String[]{m.getSeverity(), m.getSource(), m.getDescription()}, msg2);
                    list.get(0).addStatusMessages(m.getSeverity(),
                            (m.getDescription().contains("MDCP") ? lcladdStatusMessages1 : "")
                                    + lcladdStatusMessages2);
                } else {

                    if (response1.getItems() == null) {
                        String lcladdStatusMessages = CommonUtil.getLoclizedMsg("PRCE_LNE_ITM_OPTMS_ERR",
                                new String[]{m.getSource(), m.getDescription()}, m.getDescription());
                        list.get(0).addStatusMessages("Error", lcladdStatusMessages);
                        list.get(0).setOptimusError(true);
                    } else {
                        if (!QuoteUtil.isECPQuote(list.get(0))) {
                            String lcladdStatusMessages = CommonUtil.getLoclizedMsg(
                                    "PRCE_LNE_ITM_MSG_FRM_WHN_RETRVNG_GUIDNCE_VAL",
                                    new String[]{m.getSource(), m.getDescription()},
                                    "Message From " + m.getSource() + " " + m.getDescription());

                            list.get(0).addStatusMessages("Info", lcladdStatusMessages);
                            list.get(0).setOptimusError(true);
                        }
                    }
                }
            }
            if (list.get(0).getFlags().get(QtFlagType.ESCALATIONFORPARTNER) != null) {
                list.get(0).getFlags().get(QtFlagType.ESCALATIONFORPARTNER).setFlgVl(null);
            }
            if (m.getCode() != null) {
                String pricingServiceMsgCode = m.getCode();
                String pricingServiceSeverity = m.getSeverity();
                Map<Integer, AutoEscalationScenario> categoryMap;

                if (StringUtils.equals("ERROR", pricingServiceSeverity)) {
                    categoryMap = getScenario("SEVERITY", globalAccount1, null, true, null);
                    if (categoryMap.size() != 0) {
                        finalCategorylist.get(0).putAll(categoryMap);
                    }
                }
                if (partnerExclusivityAutoEscalation1) {
                    categoryMap = getScenario(pricingServiceMsgCode, globalAccount1, null, true, null);
                    if (categoryMap != null && categoryMap.size() != 0) {
                        finalCategorylist.get(0).putAll(categoryMap);
                    }
                }
            }


            return null;
        }

    };
    runnableTasks.add(tasksToExecute);
}

有人可以帮我跳过特定条件的特定循环,但不使用 continue 语句,因为它会引发错误。

4

2 回答 2

1

发生的事情是您实际上是在循环之外调用 continue ,因为 call() 函数本身没有 for 循环,因此是否仅从循环调用 call() 并不重要。你可以做些什么来解决这个问题,让调用函数返回一个布尔值,并将 continue 替换为 return true ,如果没有达到 return true 则返回 false 。然后替换:

 call()

在循环上

if(call()) continue
于 2019-02-18T14:54:03.397 回答
0

因此,我并不是说我完全理解您的代码,但您似乎正在使用continue该线程来突破。在一个普通的多线程应用程序上,看起来您是从一个循环中启动多个线程。continue调用在新线程内,而不是循环内。一旦开始编写call()方法,就离开循环来运行它。查看代码,我会尝试continuereturn. 通常我会在建议之前尝试自己运行它,但是如果没有其余代码,我无法验证它是否有效。

于 2019-02-18T14:52:18.793 回答