如何在Java中使用.orelsethorn从lambda表达式引发异常

如何在Java中使用.orelsethorn从lambda表达式引发异常,java,lambda,Java,Lambda,我编译失败了 Compilation failure [ERROR] unreported exception java.lang.Throwable; must be caught or declared to be thrown 为什么这段代码不编译 Collections.singletonList(Arrays.asList("a", "b", "c") .stream() .findAny() .orElseThrow(() -> {

我编译失败了

Compilation failure
[ERROR]  unreported exception java.lang.Throwable; must be caught or declared to be thrown
为什么这段代码不编译

Collections.singletonList(Arrays.asList("a", "b", "c")
    .stream()
    .findAny()
    .orElseThrow(() -> {
        String msg = "Failed";
        throw new IllegalArgumentException(msg);
    }));
虽然这看起来还可以

Collections.singletonList(Arrays.asList("a", "b", "c")
    .stream()
    .findAny()
    .orElseThrow(() -> new IllegalArgumentException("Failed")));
这与第一个代码块有关还是错误


在VS代码和Eclipse中,我没有从IDE中得到语法错误。

这两个代码段是不同的。在第一个示例中,在lambda中抛出一个异常。在第二个示例中,您从lambda返回一个异常

要使两个代码段一致,请将第一个代码段更改为

Collections.singletonList(Arrays.asList("a", "b", "c")
    .stream()
    .findAny()
    .orElseThrow(() -> {
        String msg = "Failed";
        return new IllegalArgumentException(msg);
    }));

在第一个示例中,您需要执行
返回新的IllegalArgumentException(msg)
,而不是
抛出
orelsetrow
函数将为您执行抛出操作。我无法复制。您的第一个代码段在这里运行良好(并且不会引发任何异常)。在Oracle jdk-1.8.0_101和jdk-11.0.3上进行了测试。上面的代码块对我来说都可以编译。这可能是IDE特有的问题吗@marstran在代码块
{}
中抛出的
也应该编译。@marstran您的评论有误导性。两个lambda都是正确的,
throw
是第一个lambda中的有效语句。看我的回答,,please@AndrewTobilko我的评论没有误导。我根本没有提到编译错误。我只是简单地指出,他应该返回异常,而不是自己将异常抛出到
orelsetrow
中。这就是为什么我写了一个注释而不是一个答案。
throw
也应该编译,它是
{}
块,而不是表达式。除了所提供的
供应商
的类型外,
orelsetrow
所推断的内容没有太大差异。