Java基础之try,catch,finally与return的执行

819 阅读2分钟

好记性不如一个烂笔头

一般情况下finally块中的代码是一定会被执行,除非JVM停止工作。

1.返回基础数据类型

(1)try块中不抛出异常的情况下

public static String getString(){
        String info;
        try {
            info ="i am try  ";
            System.out.println(info);
            return info;
        }catch (Exception e){
            info="i am catch  ";
            System.out.println(info);
            return info;
        }finally {
            info = "i am finally";
            System.out.println(info);
            return info;
        }
    }
    public static void main(String[] args){
        String i = getString();
        System.out.println("i am main = "+i);
    }

运行结果:

try块和finally块中的代码都执行了,但是finally块中的返回值覆盖了try中的return值。

(2)try块抛出异常

public static String getString(){
        String info;
        try {
            info = "i am try  ";
            //制造异常
            int j = 1/0;
            System.out.println(info);
            return info;
        }catch (Exception e){
            info="i am catch  ";
            System.out.println(info);
            e.printStackTrace();
            return info;
        }finally {
            info = "i am finally";
            System.out.println(info);
            return info;
        }
    }

运行结果:

catch块和finally块中的代码都执行了,但是finally块中的返回值覆盖了catch中的return值。

(3)finally块中没有return

public static String getString(){
        String info;
        try {
            info = "i am try  ";
            System.out.println(info);
            return info;
        }catch (Exception e){
            info="i am catch  ";
            System.out.println(info);
            e.printStackTrace();
        }finally {
            info = "i am finally";
            System.out.println(info);
        }
        return info;
    }

运行结果:

虽然try块和finally块中的代码都执行了,但是函数最终的结果是try块返回的值

2.返回引用数据类型

public static StringBuilder getSb(){
        StringBuilder info = new StringBuilder();
        try {
            info.append("i am try  ");
            System.out.println(info.toString());
            return info;
        }catch (Exception e){
            info.append("i am catch  ");
            System.out.println(info.toString());
            e.printStackTrace();
            return info;
        }finally {
            info.append("i am finally");
            System.out.println(info.toString());
            return info;
        }
    }

(1)try块中不抛出异常的情况下

(2)try块中抛出异常的情况下

(3)finally块中没有return

public static StringBuilder getSb(){
        StringBuilder info = new StringBuilder();
        try {
            int j = 1/0;
            info.append("i am try  ");
            System.out.println(info.toString());
            return info;
        }catch (Exception e){
            info.append("i am catch  ");
            System.out.println(info.toString());
            e.printStackTrace();
        }finally {
            info.append("i am finally");
            System.out.println(info.toString());
        }
        return info;
    }

运行结果和(2)运行一致

这里不再贴代码,由于返回值是引用类型,所以这3种情况下,函数的最终结果是数据的“叠加”。 try,catch,finally中可以同时都出现return,一旦return写在最后,要么在try,catch,finally都不写return,要么在try中写return,才能通过编译。需要特别注意的是,基本数据类型(就不再强行用内存解释了),简单点记忆就是基本数据类型返回值是“覆盖”,引用类型是“叠加”