Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.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 try/finally而不使用catch with return语句?_Java_Exception_Return_Try Catch - Fatal编程技术网

Java try/finally而不使用catch with return语句?

Java try/finally而不使用catch with return语句?,java,exception,return,try-catch,Java,Exception,Return,Try Catch,为什么下面代码的结果是3,为什么即使编译器检查try first,finally get也会终止并退出该方法,为什么try中的返回不会终止该方法 public int returnVal(){ try{ return 2; } finally{ return 3; } } 当你写一个最后块时,它们总是执行它。最后在从try返回值之前执行(或catch) 如果在finally中出现return语句,它将覆盖try(或catch)块

为什么下面代码的结果是3,为什么即使编译器检查try first,finally get也会终止并退出该方法,为什么try中的返回不会终止该方法

public int returnVal(){ 
    try{
        return 2;
    }
    finally{
        return 3;
    }
}

当你写一个最后块时,它们总是执行它。

最后
在从
try
返回值之前执行(或
catch

如果在
finally
中出现
return
语句,它将覆盖
try
(或
catch
)块的返回

因此,在这种情况下,最终胜利的回报:

try {
    // Exception thrown
    return 2;
} catch (Exception e) {
    return 1;
} finally {
    return -1;   // Always returns -1 also if a return statement is present in the try and in the catch clause
}

可以看出,return语句总是突然完成

前面的描述说的是“尝试转移控制”,而不仅仅是“转移控制”,因为如果在方法或构造函数中有任何try语句(§14.20),其try块或catch子句包含return语句,那么这些try语句的任何finally子句都将按从内到外的顺序执行,在控制权转移到方法或构造函数的调用方之前。突然完成finally子句可能会中断由return语句启动的控制权转移

特别检查短语
尝试转移控制权
和最后一句话。try return尝试在finally
中断由return语句启动的控制传输后传输控制


换言之,try
尝试传输控件,但由于finally块的执行仍然开放供执行,并且包含返回语句,因此finally块中尝试传输的控件前面有一个更高的
。这就是为什么您会看到值
3
,它在finally块中返回。

finally块总是在控件返回到调用函数之前执行。 因此在本例中,在返回2之前,它将调用finally并返回3

为什么try中的返回不终止该方法

public int returnVal(){ 
    try{
        return 2;
    }
    finally{
        return 3;
    }
}

您必须知道,当您在try-catch语句中放置一个返回时,返回本身由exeption处理块持有和管理

异常块仅存储您的返回,并且它仅在所有验证完成后才真正返回,这并不意味着finally块将真正影响您的返回:

public int returnVal() { 
    int i = 0;
    try {
        return i;
    }
    finally {
        i = 99;
    }
}
在这种情况下,返回值仍然是0

但是,在您的问题中提到的情况下,您会再次影响返回,并且由于异常块在完成所有验证之前不想让您的返回消失,所以您总是在异常块中存储两次返回值。结果总是3


请记住,如果您在try-catch-finally中放入一个return,那么在finally块运行之前,该return不会返回;返回本身只是被存储,直到所有内容都被验证。

最后总是调用
finally
块,这就是为什么它被称为“finally”(想想“试试这个,捕捉任何异常,最后做那个”)。不管发生什么,
finally
块总是被执行..是的,我理解这一点,但是为什么编译器忽略try中的return语句,即使它在运行时进入其中,为什么try中的return不会终止方法
finally
块总是被执行,除非您执行
System.exit()
或JVM崩溃。+1,因为它比最上面的答案更容易理解(当然是以信息较少为代价)。