1.try、catch、finally用法总结:
1)不管有没有异常,finally中的代码都会执行
2)当try、catch中有return时,finally中的代码依然会继续执行
3)finally是在return后面的表达式运算之后执行的,此时并没有返回运算之后的值,而是把值保存起来,不管finally对该值做任何的改变,返回的值都不会改变,依然返回保存起来的值。也就是说方法的返回值是在finally运算之前就确定了的
4、finally代码中最好不要包含return,程序会提前退出,也就是说返回的值不是try或catch中的值
2.关于执行顺序问题
1)
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(test());
}
public static int test(){
int i = 1;
try{
i++;
System.out.println("try block, i = "+i);
}catch(Exception e){
i ++;
System.out.println("catch block i = "+i);
}finally{
i = 10;
System.out.println("finally block i = "+i);
}
return i;
}
/*结果输出如下:
try block, i = 2
finally block i = 10
10
*/
//先执行try块,并没有捕获到异常,finally块,最后return。
2)把return放到try块中和catch块中,会怎么样呢?先return呢还是先finally呢?返回值i会改变吗?
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(test());
}
public static int test(){
int i = 1;
try{
i++;
System.out.println("try block, i = "+i);
return i;
}catch(Exception e){
i ++;
System.out.println("catch block i = "+i);
return i;
}finally{
i = 10;
System.out.println("finally block i = "+i);
}
}
/*
结果输出如下:
try block, i = 2
finally block i = 10
2
*/
可以得出:
①当try、catch中有return时,finally中的代码依然会继续执行。
②finally是在return后面的表达式运算之后执行的,此时并没有返回运算之后的值,而是把值保存起来,不管finally对该值做任何的改变,返回的值都不会改变,依然返回保存起来的值。也就是说方法的返回值是在finally运算之前就确定了的。
3)如果是操作不是基本类型会怎么样?会不一样吗?为什么?
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(test().mmp("fuck"));
}
public static Person test(){
Person person = new Person();
try{
person.setShengao("172cm"+"---try block");
System.out.println("try block");
return person;
}catch(Exception e){
person.setTizhong("100kg");
System.out.println("catch block");
return person;
}finally{
person.setXingbie("女");
System.out.println("finally block ");
}
}
package xyz;
public class Person {
public String shengao;
public String tizhong;
public String xingbie;
//public String hello(String input);
public String getShengao() {
return shengao;
}
public void setShengao(String shengao) {
this.shengao = shengao;
}
public String getTizhong() {
return tizhong;
}
public void setTizhong(String tizhong) {
this.tizhong = tizhong;
}
public String getXingbie() {
return xingbie;
}
public void setXingbie(String xingbie) {
this.xingbie = xingbie;
}
public String mmp(String fuck){
System.out.println("person : mmp");
System.out.println("shengao:"+this.shengao);
System.out.println("tizhong:"+this.tizhong);
System.out.println("xingbie:"+this.xingbie);
return fuck;
}
}
/*
结果输出如下:
try block
finally block
person : mmp
shengao:172cm---try block
tizhong:null
xingbie:女
fuck
*/
从上面可以看出,在finally中的set的性别“女”生效了,而在之前用基本类型,在finally中修改它的值不生效。为什么呢?
我们知道基本类型在栈中存储,而对于非基本类型是存储在堆中的,返回的是堆中的地址,因此内容被改变了。
4)如果在finally加入return,会怎么样? 如果在finally 抛出了异常呢?
在finally中存在return,会有黄色警告:finally block does not complete normally==>意思是finally代码块不能正常完成。