Java try/finally而不使用catch with return语句?
为什么下面代码的结果是3,为什么即使编译器检查try first,finally get也会终止并退出该方法,为什么try中的返回不会终止该方法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)块
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,因为它比最上面的答案更容易理解(当然是以信息较少为代价)。