try、catch、finally用法总结
try、catch、finally用法总结:
1、不管有没有异常,finally中的代码都会执行
2、当try、catch中有return时,finally中的代码依然会继续执行
3、finally是在return后面的表达式运算之后执行的,此时并没有返回运算之后的值,而是把值保存起来,不管finally对该值做任何的改变,返回的值都不会改变,依然返回保存起来的值。也就是说方法的返回值是在finally运算之前就确定了的。
4、finally代码中最好不要包含return,程序会提前退出,也就是说返回的值不是try或catch中的值
执行顺序
1.
1 public static void main(String[] args) {
2 // TODO Auto-generated method stub
3 System.out.println(test());
4 }
5 public static int test(){
6 int i = 1;
7 try{
8 i++;
9 System.out.println("try block, i = "+i);
10 }catch(Exception e){
11 i ++;
12 System.out.println("catch block i = "+i);
13 }finally{
14 i = 10;
15 System.out.println("finally block i = "+i);
16 }
17 return i;
18 }
结果输出如下:
try block, i = 2
finally block i = 10
10
先执行try块,并没有捕获到异常,finally 块,最后return。
2.当我们把return放到try块中和catch块中,会怎么样呢?你们会不会纠结先return呢还是先finally呢?返回值i会改变吗?
1 public static void main(String[] args) {
2 // TODO Auto-generated method stub
3 System.out.println(test());
4 }
5 public static int test(){
6 int i = 1;
7 try{
8 i++;
9 System.out.println("try block, i = "+i);
10 return i;
11 }catch(Exception e){
12 i ++;
13 System.out.println("catch block i = "+i);
14 return i;
15 }finally{
16 i = 10;
17 System.out.println("finally block i = "+i);
18 }
19 }
结果输出如下:
try block, i = 2
finally block i = 10
2
如我们总结一样:
2、当try、catch中有return时,finally中的代码依然会继续执行
3、finally是在return后面的表达式运算之后执行的,此时并没有返回运算之后的值,而是把值保存起来,不管finally对该值做任何的改变,返回的值都不会改变,依然返回保存起来的值。也就是说方法的返回值是在finally运算之前就确定了的。
3.如果是操作不是基本类型会怎么样?会不一样吗?为什么?
1 public static void main(String[] args) {
2 // TODO Auto-generated method stub
3 System.out.println(test().mmp("fuck"));
4 }
5 public static Person test(){
6 Person person = new Person();
7 try{
8 person.setShengao("172cm"+"---try block");
9 System.out.println("try block");
10 return person;
11 }catch(Exception e){
12 person.setTizhong("100kg");
13 System.out.println("catch block");
14 return person;
15 }finally{
16 person.setXingbie("女");
17 System.out.println("finally block ");
18 }
19 }
Person类
1 package xyz;
2
3 public class Person {
4 public String shengao;
5 public String tizhong;
6 public String xingbie;
7
8 //public String hello(String input);
9
10 public String getShengao() {
11 return shengao;
12 }
13
14 public void setShengao(String shengao) {
15 this.shengao = shengao;
16 }
17
18 public String getTizhong() {
19 return tizhong;
20 }
21
22 public void setTizhong(String tizhong) {
23 this.tizhong = tizhong;
24 }
25
26 public String getXingbie() {
27 return xingbie;
28 }
29
30 public void setXingbie(String xingbie) {
31 this.xingbie = xingbie;
32 }
33
34
35 public String mmp(String fuck){
36 System.out.println("person : mmp");
37 System.out.println("shengao:"+this.shengao);
38 System.out.println("tizhong:"+this.tizhong);
39 System.out.println("xingbie:"+this.xingbie);
40 return fuck;
41 }
42
43 }
结果输出如下:
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代码块不能正常完成。


浙公网安备 33010602011771号