Java 包括抛出异常的方法签名?
我知道方法签名包括方法名及其参数列表 但我们的例外情况如何 但我可以通过Java 包括抛出异常的方法签名?,java,lambda,java-8,functional-interface,throws,Java,Lambda,Java 8,Functional Interface,Throws,我知道方法签名包括方法名及其参数列表 但我们的例外情况如何 但我可以通过 () -> { try { return listServiceStatuses(); } catch (RetrieverException e) { } } 我还可以再把它扔掉 () -> { try { return listServiceStatuses(); } catch (RetrieverException e) {
() -> {
try {
return listServiceStatuses();
} catch (RetrieverException e) {
}
}
我还可以再把它扔掉
() -> {
try {
return listServiceStatuses();
} catch (RetrieverException e) {
throw e;
}
}
我知道供应商的功能接口,如果抛出不是方法签名的一部分,那么这就是真正让我困惑的地方
谢谢你的帮助 这与方法签名无关。发件人: 如果某个类的某个子类声明了一个异常,并且某个类的lambda不是异常体,则会抛出一个异常 这有点令人惊讶——我必须承认,我最初的想法是异常是方法签名的一部分 但请记住,选中的异常意味着:编译器确保您已处理所有选中的异常;但一旦编译完成,检查和未检查的异常类型将被一视同仁。请注意,在关于异常的部分中,这甚至没有提到检查性 因此,正如在运行时看到的,该方法可以抛出任何异常。如语言规范所述: 两个方法或构造函数M和N如果名称相同,则具有相同的签名,如果§8.4.4中有相同的类型参数,则具有相同的类型参数,并且在将N的形式参数类型调整为M的类型参数后,具有相同的形式参数类型
这与方法签名无关。发件人: 如果lambda主体可以抛出某个异常类E,而E是已检查的异常类,并且E不是lambda表达式所针对的函数类型的throws子句中声明的某个类的子类,则这是编译时错误 这有点令人惊讶——我必须承认,我最初的想法是异常是方法签名的一部分 但请记住,选中的异常意味着:编译器确保您已处理所有选中的异常;但一旦编译完成,检查和未检查的异常类型将被一视同仁。请注意,在关于异常的部分中,这甚至没有提到检查性 因此,正如在运行时看到的,该方法可以抛出任何异常。如语言规范所述: 两个方法或构造函数M和N如果名称相同,则具有相同的签名,如果§8.4.4中有相同的类型参数,则具有相同的类型参数,并且在将N的形式参数类型调整为M的类型参数后,具有相同的形式参数类型
好像你已经回答了你自己的问题,不是吗?Supplier.get不会抛出任何已检查的异常,因此抛出已检查异常的lambda将不符合所需的类型。@jspcal我只是这样认为,但到目前为止,我还没有找到任何正式文档来指定它。你能提供一些细节吗?@VictorGubin我知道描述如何处理这个案件的帖子,但我想知道的是为什么?@VictorGubin不是真的,没有什么可以阻止lambda抛出一个选中的异常,例如接口CheckedSupplier{T get throws e;};你不能把它当作供应商类型。你似乎已经回答了你自己的问题,不是吗?Supplier.get不会抛出任何已检查的异常,因此抛出已检查异常的lambda将不符合所需的类型。@jspcal我只是这样认为,但到目前为止,我还没有找到任何正式文档来指定它。你能提供一些细节吗?@VictorGubin我知道描述如何处理这个案件的帖子,但我想知道的是为什么?@VictorGubin不是真的,没有什么可以阻止lambda抛出一个选中的异常,例如接口CheckedSupplier{T get throws e;};你不能因为供应商类型而放弃它。
() -> {
try {
return listServiceStatuses();
} catch (RetrieverException e) {
}
}
() -> {
try {
return listServiceStatuses();
} catch (RetrieverException e) {
throw e;
}
}