gpt4 book ai didi

java - 方法签名包括抛出异常?

转载 作者:行者123 更新时间:2023-12-01 17:50:44 24 4
gpt4 key购买 nike

我知道方法签名包括方法名称及其参数列表

但是 throws Exception 怎么样? ?

public List<ServiceStatusVo> listServiceStatuses() throws RetrieverException {
...
return list;
}

如果不包含它,那么为什么我不能传入以下 lambda:

() -> listServiceStatuses()

但是我可以进去

() -> {
try {
return listServiceStatuses();
} catch (RetrieverException e) {
}
}

而且我可以再次

() -> {
try {
return listServiceStatuses();
} catch (RetrieverException e) {
throw e;
}
}

我知道Supplier<T>函数式接口(interface),这才是真正让我困惑的地方如果抛出不是方法签名的一部分。

感谢您的帮助。

最佳答案

这与方法签名无关。来自 JLS Sec 11.2.3 :

It is a compile-time error if a lambda body can throw some exception class E when E is a checked exception class and E is not a subclass of some class declared in the throws clause of the function type targeted by the lambda expression.

这有点令人惊讶 - 我必须承认我最初的想法是异常方法签名的一部分。

但请记住,“检查异常”意味着 compile-time checked exception :编译器确保您已处理所有已检查的异常;但是一旦编译完成,检查和未检查的异常类型就会被同等对待。请注意 the JVM spec在异常部分甚至没有提到检查性。

因此,正如在运行时所见,该方法可以抛出任何异常。正如语言规范中所述:

Two methods or constructors, M and N, have the same signature if they have the same name, the same type parameters (if any) (§8.4.4), and, after adapting the formal parameter types of N to the the type parameters of M, the same formal parameter types.

关于java - 方法签名包括抛出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50448579/

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