首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java 8:如何处理streams中的异常抛出方法?

Java 8:如何处理streams中的异常抛出方法?
EN

Stack Overflow用户
提问于 2014-05-09 01:25:00
回答 3查看 204.1K关注 0票数 207

假设我有一个类和一个方法

代码语言:javascript
复制
class A {
  void foo() throws Exception() {
    ...
  }
}

现在,我想为通过如下流传递的每个A实例调用foo:

代码语言:javascript
复制
void bar() throws Exception {
  Stream<A> as = ...
  as.forEach(a -> a.foo());
}

问:如何正确处理异常?代码不能在我的机器上编译,因为我不处理foo()可能抛出的异常。barthrows Exception在这里似乎没有用。为什么会这样呢?

EN

回答 3

Stack Overflow用户

发布于 2015-09-19 21:30:36

如果您想要的只是调用foo,并且您更喜欢按原样传播异常(没有包装),那么您也可以使用Java的for循环来代替(在将流转换为带有一些trickery的Iterable之后):

代码语言:javascript
复制
for (A a : (Iterable<A>) as::iterator) {
   a.foo();
}

这至少是我在JUnit测试中所做的,我不想经历包装我的受检异常的麻烦(实际上,我更喜欢我的测试抛出未包装的原始异常)。

票数 43
EN

Stack Overflow用户

发布于 2015-10-19 23:51:18

这个问题可能有点老了,但因为我认为这里的“正确”答案只有一种,这可能会导致一些问题,隐藏在你的代码中。即使有一点Controversy,检查异常的存在也是有原因的。

在我看来,你能找到的最优雅的方式是Misha here Aggregate runtime exceptions in Java 8 streams通过执行“未来”中的动作。因此,您可以运行所有工作部分,并将不工作的异常收集为单个异常。否则,您可以将它们全部收集到一个列表中,并在以后处理它们。

Benji Weber也采用了类似的方法。他建议创建一个自己的类型来收集工作部件和非工作部件。

根据您真正想要实现的输入值和输出值之间的简单映射,发生的异常可能也适用于您。

如果您不喜欢这些方法中的任何一种,请考虑使用(取决于原始异常)至少一个自己的异常。

票数 19
EN

Stack Overflow用户

发布于 2014-05-13 23:48:25

你可以用这种方式包装和解包异常。

代码语言:javascript
复制
class A {
    void foo() throws Exception {
        throw new Exception();
    }
};

interface Task {
    void run() throws Exception;
}

static class TaskException extends RuntimeException {
    private static final long serialVersionUID = 1L;
    public TaskException(Exception e) {
        super(e);
    }
}

void bar() throws Exception {
      Stream<A> as = Stream.generate(()->new A());
      try {
        as.forEach(a -> wrapException(() -> a.foo())); // or a::foo instead of () -> a.foo()
    } catch (TaskException e) {
        throw (Exception)e.getCause();
    }
}

static void wrapException(Task task) {
    try {
        task.run();
    } catch (Exception e) {
        throw new TaskException(e);
    }
}
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23548589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档