gpt4 book ai didi

java - 为什么一个方法引用了 "throws"... 也抛出的 ctor?

转载 作者:IT老高 更新时间:2023-10-28 21:00:05 26 4
gpt4 key购买 nike

我正在寻找一种优雅的方式来创建依赖注入(inject)工厂。在我的例子中,工厂只需要调用一个单参数的构造函数。我找到了 answer概述如何使用 Function<ParamType, ClassToNew>用于此类目的。

但我的问题是:在我的情况下,我的 ctor 声明抛出一些检查异常。

我没有得到:使用对该构造函数的方法引用创建该 Function 不起作用。如:

import java.util.function.Function;

public class Mcve {
public Mcve(String s) throws Exception {
// whatever
}
public static void main(String[] args) {
Function<String, Mcve> mcveFactory = Mcve::new;
}
}

告诉我关于 Mcve::new 的“未处理的异常:java.lang.Exception” .虽然这段代码没有调用构造函数。

两个问题:

  • 为什么会出现这个错误?上面的代码没有调用 ctor(还)吗?
  • 有没有什么优雅的方法可以解决这个难题? (只需将 throws Exception 添加到我的 main()没有帮助)

最佳答案

您需要提供自定义界面ThrowingFunction其中有一种方法会抛出 Exception .

public interface ThrowingFunction<ParameterType, ReturnType> {
ReturnType invoke(ParameterType p) throws Exception;
}

public class Mcve {
public Mcve(String s) throws Exception {
// whatever
}
public static void main(String[] args) {
ThrowingFunction<String, Mcve> mcveFactory = Mcve::new;
}
}

使用这种方法会调用 mcveFactory.invoke("lalala");强制你处理构造函数抛出的异常。

错误的原因是您要存储的实际函数引用(不是 100% 确定术语)引发异常,因此类型根本不匹配。 如果你可以存储Mcve::new在函数内部,调用该函数的人不再知道 Exception可以扔。如果异常真的被抛出,会发生什么?抛出异常和丢弃它都不起作用。


替代方案:如果您需要实际检索 Function<String, Mcve>最后,您需要编写一个函数(或 lambda)来调用构造函数,捕获异常并丢弃它或重新抛出它,并将其包裹在未经检查的 RuntimeException 中。 .

public class Mcve {
public Mcve(String s) throws Exception {
// whatever
}

public static void main(String[] args) {
Function<String, Mcve> mcveFactory = parameter -> {
try {
return new Mcve(parameter);
} catch (Exception e) {
throw new RuntimeException(e); // or ignore
}
};
}
}

我认为错误消息本身至少有点误导,因为您通常在实际调用该方法时会看到它。我当然可以理解导致第一个子问题的困惑。陈述类似

的内容会更清楚(遗憾的是不可能)

Incompatible types Function<String,Mcve> vs. Function<String,Mcve> throws Exception.

关于java - 为什么一个方法引用了 "throws"... 也抛出的 ctor?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47434766/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com