try,catch,finally中的return如何影响代码的执行语序

1、如果try,catch,finally里面都没有return语句,正常执行顺序如下:

try代码块正常执行完成,继续执行finally代码块,最后执行finally后面的语句块;

try代码块执行出现异常,则转去执行catch块,catch块执行完后,再执行finally代码块,最后执行finally后面的语句块。

public class Main {
static String str="";
public static void main(String[] args) {
//Scanner scanner = new Scanner(System.in);在线笔试代码
test(0);
System.out.println(str);

    str="";
    test(1);
    System.out.println(str);
}

private static void test(int i){
    try{
        if(i==1)
            throw new Exception();
        else {
            str+="111-";
            //return;
        }
    }catch (Exception e){
        str+="222-";
        //return;
    }finally {
        str+="333-";
        //return;
    }
    str+="444";//Unreacheable statement
}

}

输出结果:
<code class="language-java">111-333-444
222-333-444

2、(1)如果finally里面有return,不管try、catch里面有没有return,finally语句块后面的代码都不会执行,编译器都会提示错误:Unreachable statement。

public class Main {
static String str="";
public static void main(String[] args) {
//Scanner scanner = new Scanner(System.in);在线笔试代码
test(0);
System.out.println(str);

    str="";
    test(1);
    System.out.println(str);
}

private static void test(int i){
    try{
        if(i==1)
            throw new Exception();
        else {
            str+="111-";
            //return;
        }
    }catch (Exception e){
        str+="222-";
        //return;
    }finally {
        str+="333-";
        return;
    }
    str+="444";//Unreacheable statement
}

}

(2)如果try、catch块里面都有return,不管finally里面有没有return,finally语句块后面的代码都不会执行,编译器都会提示错误:Unreachable statement。

public class Main {
static String str="";
public static void main(String[] args) {
//Scanner scanner = new Scanner(System.in);在线笔试代码
test(0);
System.out.println(str);

    str="";
    test(1);
    System.out.println(str);
}

private static void test(int i){
    try{
        if(i==1)
            throw new Exception();
        else {
            str+="111-";
            return;
        }
    }catch (Exception e){
        str+="222-";
        return;
    }finally {
        str+="333-";
        //return;
    }
    str+="444";//Unreacheable statement
}

}

3、不管try、catch、finally里面有没有return,都会执行的组合是:try-finally 或者 try-catch-finally。如下代码中3处标记行号地方,每一个不管用咩用,都不影响最终输出结果。

public class Main {
static String str="";
public static void main(String[] args) {
//Scanner scanner = new Scanner(System.in);在线笔试代码
test(0);
System.out.println(str);

    str="";
    test(1);
    System.out.println(str);
}

private static void test(int i){
    try{
        if(i==1)
            throw new Exception();
        else {
            str+="111-";
            return;//1
        }
    }catch (Exception e){
        str+="222-";
        return;//2
    }finally {
        str+="333-";
        return;//3
    }
    //str+="444";//Unreacheable statement
}

}

输出结果:

4、在返回值方面,finally里面的return值会覆盖try、catch里面的return值。

/**
 * 测试问题:在返回值方面:finally里面的return值会覆盖try,catch里面的return值
 * @param num
 * @return
 */
static int getNum(int num){
    try{
        int result=2/num;
        return result;
    }catch(Exception e){
        return 0;
    }finally {
        if(num==0)
            return -1;
        if(num==1)
            return 1;
    }
}

}

输出结果:

<code class="language-html">-1
1
1
0

相关文章

ArrayList简介:ArrayList 的底层是数组队列,相当于动态数组。与 Java 中的数组相比,它的容量能动态增...
一、进程与线程 进程:是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。 线程...
本文为博客园作者所写:&#160;一寸HUI,个人博客地址:https://www.cnblogs.com/zsql/ 简单的一个类...
#############java面向对象详解#############1、面向对象基本概念2、类与对象3、类和对象的定义格式4、...
一、什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错。在java中,阻止当前方法或作用域...
Collection接口 Collection接口 Collection接口 Collection是最基本的集合接口,一个Collection代表一组...