java:尝试最后阻止执行
这个问题在这里已经有了答案:
从try
块返回时,返回值将存储在该方法的堆栈帧中。 之后,finally块被执行。
更改finally块中的值不会更改堆栈中已有的值。 但是,如果您从finally块中再次返回,堆栈上的返回值将被覆盖,并且新的x
将被返回。
如果你在finally块中打印x
的值,你会知道它被执行,并且x
的值将被打印出来。
static int test(){
int x = 1;
try{
return x;
}
finally{
x = x + 1;
System.out.println(x); // Prints new value of x
}
}
注意:如果返回参考值,参考值将存储在堆栈中。 在这种情况下,您可以使用该引用更改对象的值。
StringBuilder builder = new StringBuilder("");
try {
builder.append("Rohit ");
return builder;
} finally {
// Here you are changing the object pointed to by the reference
builder.append("Jain"); // Return value will be `Rohit Jain`
// However this will not nullify the return value.
// The value returned will still be `Rohit Jain`
builder = null;
}
建议阅读:
finally块被执行。 局部变量增加。 但是该局部变量的值已经被复制为返回值。
从Java语言规范14.17:return语句:
带有表达式的返回语句尝试将控制转移给包含它的方法的调用者; Expression的值将成为方法调用的值。
...
前面的描述说“试图转移控制”而不是“转移控制”,因为如果在try或catch子句中包含返回语句的方法或构造函数中有任何try语句(§14.20),那么这些语句的任何finally子句在控制转移给方法或构造函数的调用者之前,将按顺序执行try语句,从最内层到最外层。 突然完成finally子句可能会中断由return语句启动的控制权转移
在退出尝试之前,您正在返回x。 我会这样做:
public class TryCatchTest {
public static void main(String[] args) {
System.out.println(test());
}
static int test() {
int x = 1;
try {
do something with x.
} finally {
do something that will happen even in case of error;
x = x + 1;
return x;
}
}
}
链接地址: http://www.djcxy.com/p/73695.html