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) {}
}
});
另见:
关于java - 已处理的 Java 异常导致未处理的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42523575/