【问题标题】:Java8 Lambda Function assignment with exception [duplicate]Java8 Lambda函数分配异常[重复]
【发布时间】:2021-01-28 20:26:19
【问题描述】:

我有一个函数

public ShoppingCart fetchCart(Long storeId) throw NotFoundException {
    ///
}

然后我试图通过使用将此函数分配给另一个函数

Function<Long, ShoppingCart> func = e -> {
    fetchCart(e)
}

但它总是告诉我异常没有得到处理。但是当我尝试在函数分配周围添加 try/catch 时,我的“Function func”没有得到异常。

有没有办法做到这一点并捕获原始函数的异常?谢谢!

更多上下文。我这样做是因为我希望将 func 作为参数提供给另一个函数,这样这个 func 就可以并行运行另一个函数......就像比较这些函数的值甚至它们的异常。因此,该功能是必不可少的,不能在 fetchCart 中捕获..

【问题讨论】:

  • 在我看来最好的解决方案是在 fetchCart 方法中处理异常
  • 嗨 pirho,但我没有使用帖子中提到的@FunctionalInterface...我希望将此 func 分配给 fetchCart 然后将其传递给另一个函数,以便这个和另一个函数可以并行运行。有点像并行框架..
  • 没有必要使用注解@FunctionalInterface,这只是一个好习惯。接口函数也有注解,所以你正在使用它。
  • 在 java 8 的本质和接口数量的爆炸式增长中,您可以创建一个 FindableFunction&lt;T, R&gt;,它执行类似于 R apply(T input) throws NotFoundException 的操作。然后你会指定你正在寻找一个名为FindableFunctionFunction,也就是一个可以抛出你指定的异常的函数。对我来说,一个真实的例子是SQLFunction,它有throws SQLException

标签: java function exception lambda


【解决方案1】:

我认为你的问题是 NotFoundException 是一个检查异常。 Checked Exceptions(不是 RuntimeException 子类)不能在 lambda 中抛出。 一种解决方法是捕获它并在 RuntimeException 中重新抛出它作为它的原因

例如:

Function<Long, ShoppingCart> func = e -> {
        try {
            return fetchCart(e);
        } catch (NotFoundException ex) {
            RuntimeException re = new RuntimeException();
             re.initCause(ex);
             throw re;
        }
        return null;
    };

然后,当您捕获 runtimeException 时,您将不得不处理它的原因。

try {
    /// call func here
} catch(Exception e) {
    ((NotFoundException)e.getCause()).printStackTrace();
}

【讨论】:

    【解决方案2】:

    您可以将异常包装到运行时异常中,然后由调用者处理此运行时异常。

    Function<Long, ShoppingCart> func = e -> {
        try {
            return fetchCart(e);
        } catch (NotFoundException notFoundException) {
            throw new RuntimeException(notFoundException);
        }
    }
    

    一个文件中的完整代码将是:

    import java.util.function.Function;
    
    public class ShoppinCartCaller {
    
        public ShoppingCart fetchCart(Long storeId) throws NotFoundException {
          return null;
        };
    
        public static class NotFoundException extends Exception {
    
        }
    
        public static class ShoppingCart {
        }
    
        Function<Long, ShoppingCart> func = e -> {
            try {
                return fetchCart(e);
            } catch (NotFoundException notFoundException) {
                throw new RuntimeException(notFoundException);
            }
        };
    }
    

    【讨论】:

    • Ni juwili,不,我不能这样做。因为它在 throw new RuntimeException(notFoundException); 处有编译错误;让我添加 try/catch
    • 我发布的代码在哪里会出现编译器错误?我上面在我之前的代码下面附加了一个工作示例 - 为了便于阅读一个源文件..
    猜你喜欢
    • 2014-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-02
    • 2019-12-02
    相关资源
    最近更新 更多