Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 包括抛出异常的方法签名?_Java_Lambda_Java 8_Functional Interface_Throws - Fatal编程技术网

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;
    }
}