try...catch...finally代码块和return

return的位置\允许return出现的位置(能否同时出现)

return

return

return

catch

finally

finally后

1.finally块在return语句执行之后,return语句返回之前执行

2.finally块中的return语句返回结果会覆盖try块的return语句返回结果

        即如果try中有return语句,finally中也有return语句,最终执行的是finally中的return语句(无论是基本数据类型or引用数据类型)

3.finally块中的return语句返回结果会覆盖catch块中的return语句返回结果

        即如果try中有return语句,catch中也有return语句,finally中也有return语句,最终执行的是finally中的return语句(无论是基本数据类型or引用数据类型)

        try中发生异常之后,进入catch块,return语句执行完之后进入finally块,finally块执行完之后,执行return返回语句 

4.try块中发生异常,try块中异常语句后的内容不会执行(return语句自然不会执行),执行的是捕获到异常的catch语句块和finally语句块

5.如果finally块没有return语句,那么原来的返回值因为finally里的修改可能改变也有可能不变

        对于基本数据类型来说,finally中对返回值的修改不会影响try中return返回变量的值(解释:try或catch中的return要返回的值在finally执行之前会拷贝一份)

        对于引用数据类型来说,finally中对返回值的修改(修改引用变量指向对象中的值)会影响try中return返回变量的值

        对于引用数据类型来说,finally中对返回值的修改(修改引用变量的地址值)不会影响try中return返回变量的值(解释:try或catch中的return要返回的值在finally执行之前会拷贝一份)

6.try中发生异常时,return语句写在catch块中

        try中发生异常之后,进入catch块,return语句执行完之后进入finally块,finally块执行完之后,执行return返回语句

        对于基本数据类型来说,finally中对返回值的修改不会影响try中return返回变量的值(解释:try或catch中的return要返回的值在finally执行之前会拷贝一份)

        对于引用数据类型来说,finally中对返回值的修改(修改引用变量指向对象中的值)会影响try中return返回变量的值

        对于引用数据类型来说,finally中对返回值的修改(修改引用变量的地址值)不会影响try中return返回变量的值(解释:try或catch中的return要返回的值在finally执行之前会拷贝一份)

7.finally语句一定会被执行吗?

        当程序进入try语句之前就出现异常时,会直接结束

        try语句块中有强制退出时也不会执行finally语句块中的代码

package com.atdc.finallyAndReturn;

/*
 * @Author: guozhenran
 * @Date: 2023/4/25 10:07
 * @Description: finally块在return语句执行之后,return语句返回之前执行
 */
public class Demo01 {
    public static void main(String[] args) {
        System.out.println(func());
    }

    public static int func() {
        int a = 10;
        try {
            System.out.println("try中的代码块");
            a += 10;
            return a;
        } catch (Exception e) {
            System.out.println("catch中的代码块");
        } finally {
            System.out.println("finally中的代码块");
            a += 10;
            if (a > 10) {
                System.out.println("a > 10," + "a=" + a);
            }
            a += 10;
        }
        System.out.println("haha");//如果catch中添加了【return a += 1000;】,这里会报错:Unreachable statement
        return a;
    }
}

 

package com.atdc.finallyAndReturn;

/**
 * @Author: guozhenran
 * @Date: 2023/4/25 10:23
 * @Description: finally块中的return语句返回结果会覆盖try块的return语句返回结果
 *      即如果try中有return语句,finally中也有return语句,最终执行的是finally中的return语句(无论是基本数据类型or引用数据类型)
 */
public class Demo02_1 {
    public static void main(String[] args) {
        System.out.println(func());
    }

    public static int func(){
        int a = 10;
        try{
            System.out.println("try中的代码块");
            a += 10;
            return a;
        }catch (Exception e){
            System.out.println("catch中的代码块");
        }finally {
            System.out.println("finally中的代码块");
            a += 10;
            if(a > 10){
                System.out.println("a>10," + "a=" + a);
            }
            a += 10;
            return a;
        }
    }
}
package com.atdc.finallyAndReturn;
import java.util.HashMap;
import java.util.Map;
/**
 * @Author: guozhenran
 * @Date: 2023/4/25 10:31
 * @Description: finally块中的return语句返回结果会覆盖try块的return语句返回结果
 *  *      即如果try中有return语句,finally中也有return语句,最终执行的是finally中的return语句(无论是基本数据类型or引用数据类型)
 */
public class Demo02_2 {
    public static void main(String[] args) {
        System.out.println(getMap());
    }

    public static Map<String,String> getMap(){
        Map<String,String> map = new HashMap<>();
        map.put("KEY","INIT");
        try{
            map.put("KEY","try");
            return map;
        }catch (Exception e){
            e.printStackTrace();
            map.put("KEY","catch");
        }finally {
            map.put("KEY","finally");
            map = null;
            return map;
        }
    }
}
package com.atdc.finallyAndReturn;

/**
 * @Author: guozhenran
 * @Date: 2023/4/25 10:46
 * @Description: finally块中的return语句返回结果会覆盖catch块中的return语句返回结果
 *       即如果try中有return语句,catch中也有return语句,finally中也有return语句,最终执行的是finally中的return语句(无论是基本数据类型or引用数据类型)
 *
 *      try中发生异常之后,进入catch块,return语句执行完之后进入finally块,finally块执行完之后,执行return返回语句
 *      对于基本数据类型来说,finally中对返回值的修改不会影响try中return返回变量的值
 *      (解释:try或catch中的return要返回的值在finally执行之前会拷贝一份)
 */
public class Demo03_1 {
    public static void main(String[] args) {
        System.out.println(func());
    }

    public static int func(){
        int a = 10;
        try{
            System.out.println("try中的代码块");
            a = a /0;
            a += 10;
            return a ;
        }catch (Exception e){
            System.out.println("catch中的代码块");
            a += 10;
            return a;
        }finally {
            System.out.println("finally中的代码块");
            a += 10;
            if (a > 10){
                System.out.println("a > 10, a = "+a);
            }
            a += 10;
            return a;
        }
//        System.out.println("hahaha");//报错,Unreachable statement
//        return a += 10000;报错,Unreachable statement
    }
}
package com.atdc.finallyAndReturn;

import java.util.HashMap;
import java.util.Map;

/**
 * @Author: guozhenran
 * @Date: 2023/4/25 10:51
 * @Description: finally块中的return语句返回结果会覆盖catch块中的return语句返回结果
 *        即如果try中有return语句,catch中也有return语句,finally中也有return语句,最终执行的是finally中的return语句(无论是基本数据类型or引用数据类型)
 *
 *      try中发生异常之后,进入catch块,return语句执行完之后进入finally块,finally块执行完之后,执行return返回语句
 *      对于引用数据类型来说,finally中对返回值的修改(修改引用变量指向对象中的值)会影响try中return返回变量的值
 *      对于引用数据类型来说,finally中对返回值的修改(修改引用变量的地址值)不会影响try中return返回变量的值
 *      (解释:try或catch中的return要返回的值在finally执行之前会拷贝一份)
 */
public class Demo03_2 {
    public static void main(String[] args) {
        System.out.println(getMap());
    }

    public static Map<String, String> getMap() {
        Map<String, String> map = new HashMap<>();
        map.put("KEY", "INIT");
        try {
            map.put("KEY", "try");
            String s = null;
            System.out.println(s.charAt(0));
            return map;
        } catch (Exception e) {
            e.printStackTrace();
            map.put("KEY", "catch");
            return map;
        } finally {
            map.put("KEY", "finally");
            map.remove("KEY");
            map.put("KEY", "finally2");
            map = null;
            System.out.println(map);
            return map;
        }
    }
}
package com.atdc.finallyAndReturn;

/**
 * @Author: guozhenran
 * @Date: 2023/4/25 10:28
 * @Description: 如果finally块没有return语句,那么原来的返回值因为finally里的修改可能改变也有可能不变
 *      对于基本数据类型来说,finally中对返回值的修改不会影响try中return返回变量的值
 *      (解释:try或catch中的return要返回的值在finally执行之前会拷贝一份)
 */
public class Demo04_1 {
    public static void main(String[] args) {
        System.out.println(func());
    }

    public static int func(){
        int a = 10;
        try{
            System.out.println("try中的代码块");
            a += 10;
            return a;
        }catch (Exception e){
            e.printStackTrace();
            System.out.println("catch中的代码块");
        }finally {
            System.out.println("finally中的代码块");
            a += 10;
            if(a > 10){
                System.out.println("a > 10,a="+a);
            }
            a += 10;
        }
        return a;
    }
}
package com.atdc.finallyAndReturn;

/**
 * @Author: guozhenran
 * @Date: 2023/4/25 10:31
 * @Description: 如果finally块没有return语句,那么原来的返回值因为finally里的修改可能改变也有可能不变
 *      对于引用数据类型来说,finally中对返回值的修改(修改引用变量指向对象中的值)会影响try中return返回变量的值
 *      对于引用数据类型来说,finally中对返回值的修改(修改引用变量的地址值)不会影响try中return返回变量的值
 *      (解释:try或catch中的return要返回的值在finally执行之前会拷贝一份)
 */
import java.util.HashMap;
import java.util.Map;

public class Demo04_2 {
    public static void main(String[] args) {
        System.out.println(getMap());
    }

    public static Map<String,String> getMap(){
        Map<String,String> map = new HashMap<>();
        map.put("KEY","INIT");
        try{
            map.put("KEY","try");
            return map;
        }catch (Exception e){
            e.printStackTrace();
            map.put("KEY","catch");
        }finally {
            map.put("KEY","finally");
            map = null;
        }
        map.put("KEY", "hahaha");
        return map;
    }
}
package com.atdc.finallyAndReturn;

/**
 * @Author: guozhenran
 * @Date: 2023/4/25 10:43
 * @Description: try块中发生异常,try块中异常语句后的内容不会执行(return语句自然不会执行),执行的是捕获到异常的catch语句块和finally语句块
 */
public class Demo05 {
    public static void main(String[] args) {
        System.out.println(func());
    }

    public static int func() {
        int a = 10;
        try {
            System.out.println("try中的代码块");
            a = a / 0;
            a += 10;
            return a;
        } catch (Exception e) {
            a += 10;
            System.out.println("catch中的代码块");
        } finally {
            System.out.println("finally中的代码块");
            a += 10;
            if (a > 20) {
                System.out.println("a > 20,a =" + a);
            }
            a += 10;
        }
        System.out.println("hahaha");
        return a;
    }
}
package com.atdc.finallyAndReturn;

/**
 * @Author: guozhenran
 * @Date: 2023/4/25 10:46
 * @Description: try中发生异常时,return语句写在catch块中
 *      try中发生异常之后,进入catch块,return语句执行完之后进入finally块,finally块执行完之后,执行return返回语句
 *      对于基本数据类型来说,finally中对返回值的修改不会影响try中return返回变量的值
 *      (解释:try或catch中的return要返回的值在finally执行之前会拷贝一份)
 */
public class Demo06_1 {
    public static void main(String[] args) {
        System.out.println(func());
    }

    public static int func(){
        int a = 10;
        try{
            System.out.println("try中的代码块");
            a = a /0;
            a += 10;
            return a ;
        }catch (Exception e){
            System.out.println("catch中的代码块");
            a += 10;
            return a;
        }finally {
            System.out.println("finally中的代码块");
            a += 10;
            if (a > 10){
                System.out.println("a > 10, a = "+a);
            }
            a += 10;
        }
//        System.out.println("hahaha");//报错,Unreachable statement
//        return a += 10000;报错,Unreachable statement
    }
}
package com.atdc.finallyAndReturn;

import java.util.HashMap;
import java.util.Map;

/**
 * @Author: guozhenran
 * @Date: 2023/4/25 10:51
 * @Description: try中发生异常时,return写在catch语句中
 *      try中发生异常之后,进入catch块,return语句执行完之后进入finally块,finally块执行完之后,执行return返回语句
 *      对于引用数据类型来说,finally中对返回值的修改(修改引用变量指向对象中的值)会影响try中return返回变量的值
 *      对于引用数据类型来说,finally中对返回值的修改(修改引用变量的地址值)不会影响try中return返回变量的值
 *      (解释:try或catch中的return要返回的值在finally执行之前会拷贝一份)
 */
public class Demo06_2 {
    public static void main(String[] args) {
        System.out.println(getMap());
    }

    public static Map<String, String> getMap() {
        Map<String, String> map = new HashMap<>();
        map.put("KEY", "INIT");
        try {
            map.put("KEY", "try");
            String s = null;
            System.out.println(s.charAt(0));
            return map;
        } catch (Exception e) {
            e.printStackTrace();
            map.put("KEY", "catch");
            return map;
        } finally {
            map.put("KEY", "finally");
            map.remove("KEY");
            map.put("KEY", "finally2");
            map = null;
            System.out.println(map);
        }
    }
}
package com.atdc.finallyAndReturn;

/**
 * @Author: guozhenran
 * @Date: 2023/4/25 10:49
 * @Description: finally语句一定会被执行吗?
 *      当程序进入try语句之前就出现异常时,会直接结束
 *      try语句块中有强制退出时也不会执行finally语句块中的代码
 */
public class Demo07 {
    public static void main(String[] args) {
        int a = 10;
        try{
            System.out.println("try block");
            System.exit(0);
        }catch (Exception e){
            System.out.println("catch block");
        }finally {
            System.out.println("finally block");
        }
    }
}

参考:

finally语句与return语句详解_finally return_星光_依旧灿烂的博客-CSDN博客

finally 与 return - Hello_xzy_World - 博客园

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值