直接上代码演示。
1、对于基本数据类型
public static int getInt(){
int i = 0;
try{
i++;
return i;
} catch(Exception e){
i++;
return i;
}finally{
i++;
System.out.println("finally执行结果:"+i);
}
}
执行结果:
finally执行结果:2
1
finally语句块始终会执行,但i只在finally语句块里面有效,且finally没有返回语句,所以try里面返回1
public static int getInt(){
int i = 0;
try{
i++;
int j= i/0;
return i;
} catch(Exception e){
i++;
return i;
}finally{
i++;
System.out.println("finally执行结果:"+i);
//return i;
}
}
执行结果:
finally执行结果:3
2
try里面发生运行时异常,执行顺序try-catch-finally,所以finally输出为3,return是在catch,finally里面i++操作只在当前语句块有效,所以catch里面返回值为2。
public static int getInt(){
int i = 0;
try{
i++;
int j= i/0;
return i;
} catch(Exception e){
i++;
return i;
}finally{
i++;
System.out.println("finally执行结果:"+i);
return i;
}
}
finally执行结果:3
3
执行顺序try-catch-finally,当finally有return时,最终在finally语句块里返回,所以值为3
2、集合
public static void main(String[] args) {
System.out.println(get().toString());
}
public static List get(){
List<Integer> list = new ArrayList<>();
try{
list.add(1);
return list;
} catch(Exception e){
list.add(2);
return list;
}finally{
list.add(3);
}
}
执行结果:
[1, 3]
因为集合new时,是分配在堆内存的,try和finally语句块里面使用的list集合,共同指向同一的内存地址,当进行add操作时,操作同一个内存地址所对应的list,所以执行结果list集合有1 3两个元素。