语法糖Finally的执行问题和关于++的理解
1.1引言finally与++的问题
我遇到的一些关于finally问题的总结
public class FinallyTest {
public static void main(String[] args) {
int i=add();
System.out.println(i);
}
public static int add(){
int i=10;
try {
i++;
return i;
}catch (Exception e){
System.out.println(i);
}finally {
i++;
System.out.println("finally执行了");
}
return -1;
}
}
finally执行了
11
这里执行了两次i++输出的却还是11;不知道i++的执行步骤的先看2.1;
其实事情是这样的:try里面的执行完了,i的值已经被拷贝一份存在指定位置了,当这个方法还没有结束,finally是肯定要执行的,他把方法里面的局部变量修改了,然后执行return返回指定位置里的数,方法结束了,所以说finally并不影响try里面的值;
public class FinallyTest {
public static void main(String[] args) {
int i = add();
System.out.println(i);
}
public static int add() {
int i = 10;
try {
i++;
return i;
} catch (Exception e) {
System.out.println(i);
} finally {
i++;
System.out.println("finally执行了");
return i;
}
}
}
finally执行了
12
由于最后必须执行finally所以提前返回了,不建议在finally里面写任何导致程序提前结束的代码,会导致方法无法正常返回;它一般用来清除IO资源等非内存资源;
1.2finally不会执行的三种情况
- System.exit()的作用是中止当前虚拟机,虚拟机都被中止了,finally代码块自然不会执行;
- 守护(daemon)线程被中止时;
- 不进入try代码块或者程序被中止时就不会执行;
2.1关于++执行步骤的理解
public class AndDemo {
public static void main(String[] args) {
int i=10;
i++;
System.out.println(i);
}
}
再使用javap看它的虚拟机时怎么执行的
``
++操作不是原子操作,它有三个步骤:
1.先将i入栈;
2,将i存入局部变量表并+1,此时栈中的i没有变化;
3.返回栈中的i;