java - 已处理的 Java 异常导致未处理的异常

标签 java

public List<OpBase> getHistory(ESRequest historyRequest)
        throws IOException, ResourceNotFoundException, URISyntaxException {
    String url = baseUrl + opIndex + "/_search";
    String resp = makeESQuery(historyRequest, url);
    HistoryResponse historyResponse = objectMapper.readValue(resp, HistoryResponse.class);
    List<OpBase> returnMsgList = new ArrayList<>();
    historyResponse.tasks.tasks.forEach(editTaskMsgResponse -> {
            Map<String, Object> msgObject = editTaskMsgResponse.source.msg;
            String taskType = (String) msgObject.get("task_type");
            EditTaskType editTaskType = EditTaskType.valueOf(taskType);
            switch(editTaskType) {
                case MIGRATE_PLACE: returnMsgList.add(objectMapper.readValue(
                        objectMapper.writeValueAsString(msgObject), MatchingTaskOperatorMetricsMsg.class));
                case CURATE_PLACE:
                case QC_PLACE: returnMsgList.add(objectMapper.readValue(objectMapper.writeValueAsString(msgObject),
                        MatchingTaskOperatorMetricsMsg.class));
            }
        });
    return returnMsgList;
}

我收到一个未处理的 IOException 异常错误,其中包含类似 objectMapper.readValue(objectMapper.writeValueAsString(msgObject), MatchingTaskOperatorMetricsMsg.class));

但是我明确的说这个方法会抛出这个异常?

最佳答案

此警告可能会与包含在 switch-case 语句中的行一起显示。放在它外面的那个可以正常工作。

原因是因为该代码在 lambda 表达式中。在流和 lambda 表达式中,未处理的异常不会以这种方式处理。

您必须将编写在 lambda 表达式中的代码包装在 try-catch

historyResponse.tasks.tasks.forEach(editTaskMsgResponse -> {
            Map<String, Object> msgObject = editTaskMsgResponse.source.msg;
            String taskType = (String) msgObject.get("task_type");
            EditTaskType editTaskType = EditTaskType.valueOf(taskType);
            switch(editTaskType) {
                case MIGRATE_PLACE: 
                    try {
                        returnMsgList.add(objectMapper.readValue(objectMapper.writeValueAsString(msgObject), MatchingTaskOperatorMetricsMsg.class));
                    }
                    catch(IOException io) {}
                case CURATE_PLACE:
                case QC_PLACE: 
                    try {
                        returnMsgList.add(objectMapper.readValue(objectMapper.writeValueAsString(msgObject), MatchingTaskOperatorMetricsMsg.class));
                    }
                    catch(IOException io) {}
            }
        });

另见:

  1. Java 8 method reference unhandled exception
  2. Java 8: How do I work with exception throwing methods in streams?

关于java - 已处理的 Java 异常导致未处理的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42523575/

相关文章:

java 8 : Are LongAdder and LongAccumulator preferred to AtomicLong?

java - 等同于 Mortar 和 Flow 的 onActivityResult?

java - 如何使用PrintWriter和flush()在文本文件上打印内容?

java - 如何使用 JAXB 解码此 XACML XML 片段?

Java Swing : how to align menu items in rows and columns?

java - 使用 GSON 解析 JSON 数组

java - 阻止 jackson 改变变量名的大小写

java - volatile 和更多线程

java - 增加 HTTP 客户端超时

java - JSP用JSP打印数组