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

如何抛出java8 lambda表达式的自定义检查异常?[副本]

彭嘉赐
2023-03-14
private static void readStreamWithjava8() {

    Stream<String> lines = null;

    try {
        lines = Files.lines(Paths.get("b.txt"), StandardCharsets.UTF_8);
        lines.forEachOrdered(line -> process(line));
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (lines != null) {
            lines.close();
        }
    }
}

private static void process(String line) throws MyException {
    // Some process here throws the MyException
}

我怎样才能用Java8做到这一点呢?

共有1个答案

费学
2023-03-14

简单的回答是你不能。这是因为ForeachOrdered采用Consumer,而Consumer.Accept声明为抛出任何异常。

解决办法是做一些类似的事情

List<MyException> caughtExceptions = new ArrayList<>();

lines.forEachOrdered(line -> {
    try {
        process(line);
    } catch (MyException e) {
        caughtExceptions.add(e);
    }
});

if (caughtExceptions.size() > 0) {
    throw caughtExceptions.get(0);
}

但是,在这些情况下,我通常在process方法中处理异常,或者使用for-loops的老式方法处理异常。

 类似资料:
  • 如何在Lambda中处理和重新抛出异常?当我试图用try/catch块包围调用时,它只是在lambda表达式中捕获它。我在方法签名中有ServiceException,所以我只想重新抛出它。是可能还是我漏掉了什么?

  • 我试图在lambda内部抛出一个异常,但它总是给我一个错误,表示未处理的IOException。 有人能告诉我我做错了什么吗?

  • 问题内容: 假设我开发了一个扩展,该扩展不允许测试方法名称以大写字符开头。 现在,我要测试我的扩展程序是否按预期工作。 如何编写测试以验证尝试执行第二种方法是否抛出带有特定消息的RuntimeException? 问题答案: 在尝试了答案中的解决方案和注释中链接的问题之后,我最终使用了JUnit Platform Launcher解决方案。 JUnit本身不会运行,因为它是不带的内部类。因此,在构

  • "CATCH"应该严格地在"扔"之后叫吗?" 例1: 错误: 找不到方法“接收器”:没有方法缓存,也没有^在/tmp/739536251/main块中查找_方法。pl6第11行 例2: 无误

  • 假设我想在收到特定异常时恢复某个值,否则返回失败的未来。我希望是这样的: 如果函数会抛出检查过的异常,我想在链式方法中处理它。我尝试过和,但都无法编译。是否为这种情况提供了任何解决方案?我知道接口是方法的参数,它不会抛出任何异常——在这种情况下,我只想返回已经失败的未来。我想找到使用Java8的解决方案。

  • 问题内容: 我如何写一个等于的lambda表达式: 不允许以下内容: 问题答案: 皮肤化Python的方法不止一种: Lambda接受语句。既然是一条语句,您可以编写一个通用的提升器: 但是,如果您的目标是避免使用,则显然不能削减它。但是,它确实允许您有条件地引发异常,例如: 另外,您可以在不定义命名函数的情况下引发异常。您所需要的只是强健的腹部(给定的代码是2.x): 和python3 强健胃部