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

处理Java8流中检查的异常[重复]

蒙奇
2023-03-14

假设您有一个第三方库,它公开了下一个接口。

interface Mapper {

    String doMap(String input) throws CheckedException;

}

class CheckedException extends Exception {

}
class MapperImpl implements Mapper {

    public String doMap(String input) throws CheckedException {
        return input;
    }

}
public static void main(String[] args) {
    List<String> strings = Arrays.asList("foo", "bar", "baz");
    Mapper mapper = new MapperImpl();

    List<String> mappedStrings = strings
            .stream()
            .map(mapper::doMap)
            .collect(Collectors.toList());
}

代码无法编译,因为Function不知道如何处理由domap声明的CheckedException。我想出了两个可能的解决方案。

解决方案#1-包装调用

.map(value -> {
                try {
                    return mapper.doMap(value);
                } catch (CheckedException e) {
                    throw new UncheckedException();
                }
            })

解决方案#2-编写实用程序方法

public static final String uncheck (Mapper mapper, String input){
    try {
        return mapper.doMap(input);
    } catch (CheckedException e){
        throw new UncheckedException();
    }
}
.map(value -> Utils.uncheck(mapper, value))

共有1个答案

刘乐童
2023-03-14

您基本上列出了两个可行的选项。

另一个选择是使检查的异常被抛出流处理函数(“传播”或“潜行”检查的异常)。这是通过捕获检查的异常并将其重新抛出为runtimeexception(通过强制转换)来完成的。看看这个伟大的答案,了解详细情况。

已经开发了多个库来处理流API中的异常处理。例如,您可以查看NoException库:https://NoException.machinezoo.com/

.map(value -> Exceptions.sneak().function(mapper::doMap))

.map(value -> Exceptions.wrap().function(mapper::doMap))

附注:我不是库的作者,也不是贡献者,但我在几个项目中使用过这个库。

 类似资料:
  • 我有一些代码抛出一个检查异常。我想在lambda中调用该代码,以便从另一个映射创建一个映射: 其中是引发异常的代码: 现在编译器肯定会抱怨没有处理异常。所以我用一个来包围它,看起来很难看: 因为我们需要返回-case中的内容。然而,在这种例外情况下,返回任何内容都没有多大意义,这就是为什么我实际上不想在该级别处理异常。难道我不能在我创建lambda的调用代码中处理异常吗?所以说只是上面一层? 但这

  • 曾发表过多篇文章,但大多数都与处理错误消息有关,而不是处理过程中的异常处理。 我想知道如何处理流应用程序接收到的消息,并且在处理消息时出现异常?异常可能是由于多种原因造成的,如网络故障、RuntimeException等。, 有人能提出正确的方法吗?我应该使用setUncaughtExceptionHandler吗?还是有更好的方法

  • 主要内容:前记,1.processHandlerException方法前记 根据之前的文章方法中的方法返回处理的方法 1.processHandlerException方法 这个方法就是如果出现异常的话, 异常解析器进行处理异常。 先判断是否是注解下的方法, 如果是的话另外处理 -> 判断是否是注解下的方法 这里的主要有3个实现类 1.1注解下的异常 1.2注解下的方法 获取到装填码 获取到出错理由 然后渲染异常的页面 返回空的ModelAndView 1.3解析方

  • 问题内容: 曾经经历过多个帖子,但是其中大多数都是相关的处理错误消息,与处理它们时的异常处理无关。 我想知道如何处理流应用程序收到的消息,并且在处理消息时出现异常?该异常可能是由于多种原因造成的,例如网络故障,RuntimeException等, 有人可以建议正确的做法吗?我应该使用 吗?或者,还有更好的方法? 如何处理重试? 问题答案: 这取决于您要如何处理生产者方面的异常。如果将对生产者抛出异

  • 我有以下代码段。 由于以下错误,此操作无法编译。 未处理的异常类型AddressException 我研究了一些,所有的解决方案都只是将检查的异常包装在自定义方法中的运行时异常中。我想避免为那些东西编写额外的代码。这类案件有没有规范的处理方式? 到目前为止我所做的是 但看起来不太好。我可以发誓,在其中一个教程中,我看到了或类似内容的标准内容。

  • 这是链接中问题的继续:我正在学习java中的异常处理(基本上是在继承中),子类方法必须抛出异常,该异常是父类方法的子类。 “当子类重写超类中的方法时,子类方法定义只能在父类方法(或重写方法)的throws子句中指定异常类的所有或子集” 这是一条规则。但我不知道制定这条规则的原因是什么,为什么不允许反之亦然。为什么要创建此规则