当前位置: 首页 > 知识库问答 >
问题:

处理lambda[duplicate]中检查的异常

闻人高卓
2023-03-14

我有一些代码抛出一个检查异常。我想在lambda中调用该代码,以便从另一个映射创建一个映射:

Map<String, Coordinate> map = getMap();
Map<String, Integer> result = map.entrySet().stream().collect(
    toMap(x -> x.getKey(), x -> doSomething(x.getValue)));

其中dosometing是引发异常的代码:

int doSomething(Coordinate c) throws MyException { ... }

现在编译器肯定会抱怨没有处理异常。所以我用一个try-catch来包围它,看起来很难看:

Map<String, Integer> result = map.entrySet().stream().collect(
    toMap(x -> x.getKey(), x -> {
        try {
            return doSomething(x.getValue());
        } catch (MyException e) {
            e.printStackTrace();
            // return some error-code here???
        }
    }));

因为我们需要返回catch-case中的内容。然而,在这种例外情况下,返回任何内容都没有多大意义,这就是为什么我实际上不想在该级别处理异常。难道我不能在我创建lambda的调用代码中处理异常吗?所以说只是上面一层?

try {
    Map<String, Integer> result = ...
} catch (MyException e) { ... }

但这无法编译,因为从lambda引发的异常未被处理。

共有1个答案

壤驷俊逸
2023-03-14

来自Baeldung的博客:您可以定义可以抛出异常的消费者:

@FunctionalInterface
public interface ThrowingConsumer<T, E extends Exception> {
    void accept(T t) throws E;
}

和将检查的异常映射到runtimeexception的静态包装:

static <T> Consumer<T> throwingConsumerWrapper(
  ThrowingConsumer<T, Exception> throwingConsumer) {

    return i -> {
        try {
            throwingConsumer.accept(i);
        } catch (Exception ex) {
            throw new RuntimeException(ex);
        }
    };
}

那么你可以称之为:

Map<String, Integer> result = map.entrySet().stream()
    .collect(
        throwingConsumerWrapper(toMap(x -> x.getKey(), x -> doSomething(x.getValue)))
    );
 类似资料:
  • 我有以下代码段。 由于以下错误,此操作无法编译。 未处理的异常类型AddressException 我研究了一些,所有的解决方案都只是将检查的异常包装在自定义方法中的运行时异常中。我想避免为那些东西编写额外的代码。这类案件有没有规范的处理方式? 到目前为止我所做的是 但看起来不太好。我可以发誓,在其中一个教程中,我看到了或类似内容的标准内容。

  • 我对lambda表达有意见。我的代码: 有可能吗?我只能使用java.util.function。我尝试从“lambda”中删除try catch,而我“main”方法应该正在捕获异常。

  • 使用CompletableFuture这一伟大特性,我想将使用异常的旧异步代码转换为这一新特性。但检查的异常是困扰我的东西。这是我的代码。 方法的签名: 如何处理ComletableFuture中的检查异常?

  • 假设您有一个第三方库,它公开了下一个接口。 代码无法编译,因为Function不知道如何处理由domap声明的CheckedException。我想出了两个可能的解决方案。 解决方案#1-包装调用 解决方案#2-编写实用程序方法

  • 我正在学习spring.io教程。有一个函数是这样的:

  • 异常检测与处理 [MCE] mce=off 彻底禁用MCE(CONFIG_X86_MCE) [MCE] mce=dont_log_ce 不为已纠正错误(corrected error)记录日志。 [MCE] mce=容错级别[,超时] 容错级别(还可通过sysfs设置): 0 在出现未能纠正的错误时panic,记录所有已纠正的错误 1(默认值) 在出现未能纠正的错误时panic或SIGBUS,记录