JAVA异常处理之try、catch、finally

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代码块不能正常完成。

转自try、catch、finally用法总结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值