Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.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/1/typo3/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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/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 - Fatal编程技术网

Java 为什么在最后的一次尝试中,回报总是最后的?

Java 为什么在最后的一次尝试中,回报总是最后的?,java,Java,在我的catch块中,返回一个代码会发生什么情况 public class TryCatchFinallyTest { @Test public void test_FinallyInvocation() { String returnString = this.returnString(); assertEquals("B", returnString); } String returnString() {

在我的catch块中,
返回一个
代码会发生什么情况

public class TryCatchFinallyTest {

    @Test
    public void test_FinallyInvocation()
    {
        String returnString = this.returnString();
        assertEquals("B", returnString);
    }

    String returnString()
    {
        try
        {
            throw new RuntimeException("");
        }
        catch (RuntimeException bogus)
        {
            System.out.println("A");
            return "A";
        }
        finally
        {
            System.out.println("B");
            return "B";
        }
    }
}

finally块将始终执行,而catch块仅在捕获到异常时执行

在方法的任何返回/退出之前执行finally get。因此,当你

return "A";
它是这样执行的:

System.out.println("B");//Finally block
return "B";//Finally block
return "A";//Return from exception catch
因此,返回的是“B”,而不是
返回“A”之前的“A”

最后将调用
块,该块将
返回“B”
,您的
返回的“A”
将被跳过,并且永远不会执行。这是因为
finally
块总是在方法的
return
语句之前执行,如果您是从
finally
块返回某些内容,那么
try/catch
语句的
return
语句总是会被跳过

注意:对于Java程序员来说,从
finally
块返回不是一个好的实践。如果从
finally
块返回内容,JAVA编译器还会向您显示警告“finally块未正常完成”。

可能
返回“A”被编译器优化掉了,也许不是,而“A”只是被动态替换。事实上,这并不重要,因为您不应该拥有此代码

这是将finally用于控制流的经典问题示例之一:您丢失了一些指令,另一个程序员可能看不到“意图”(事实上,它可能只是一个bug或一个恶作剧)

您可能已经注意到javac发出警告“finally block不能正常完成”

最后

可以将finally子句附加到try-catch块。即使从try或catch块中抛出异常,finally子句中的代码也将始终被执行。如果您的代码在try或catch块中有一个return语句,那么finally块中的代码将在从方法返回之前执行


References

这篇引文没有明确说明所考虑的返回语句是finally块的语句。请看最后一行,finally块将在返回之前执行。因此,当return语句找到时,它将调用实际返回的finally块。以下是我能找到的JLS中最相关的部分:。这说明,如果catch块成功完成,那么将执行finally块。在我自己运行了一个示例并阅读了该部分之后,这使我相信在本例中catch块的return语句被丢弃了。当然,您可能会询问JVM实现显式执行的详细信息,而不是JVM应该显示的行为。你能澄清一下你在找什么吗?