Try-Catch-Finally

Catch

try中的代码抛出异常后,会被catch进行捕获和消化,try中的其他代码不会继续执行,但try外面中的代码会继续被执行。

public class Catch {
    public static void main(String[] args) {
        try {
            System.out.println("try开始");
            int i = 1/0;
            System.out.println("捕获异常后继续执行");
        }catch (Exception e){
            System.out.println(e);
        }
        System.out.println("try外面的代码被执行");
    }
}

运行结果

try开始
java.lang.ArithmeticException: / by zero
try外面的代码被执行

Finally

主要分析几种return情况

第一种情况(Finally中有return):

public class TryTest1 {
    public static void main(String[] args) {
        System.out.println(test());
    }
    public static int test(){
        int num = 10;
        try{
            System.out.println("try开始执行");
            return num+=30;
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            System.out.println("finally执行");
            num = 50;
            return num;
        }
    }
}

运行结果

try开始执行
finally执行
50

如果finally中有return语句,那么将会覆盖掉之前的return

第二种情况(finally中没有return):

public class TryTest2 {
    public static void main(String[] args) {
        System.out.println(test());
    }
    public static int test(){
        int num = 10;
        try{
            System.out.println("try开始执行");
            return num+=30;
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            System.out.println("finally执行");
        }
        return num;
    }
}

运行结果

try开始执行
finally执行
40

如果finally中没有return语句,则返回try中的return

注意: 返回的值为try中的return返回的,并不是最后的return返回的

public class TryTest2 {
    public static void main(String[] args) {
        System.out.println(test());
    }
    public static int test(){
        int num = 10;
        try{
            System.out.println("try开始执行");
            return num+=30;
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            System.out.println("finally执行");
        }
        return 1;
    }
}

运行结果

try开始执行
finally执行
40

第三种情况(finally中没有reuturn,但改变了返回的值)

基本数据类型改变时

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

    public static int test(){
        int num = 10;

        try {
            System.out.println("try开始执行");
            return num+=30;
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            System.out.println("finally执行");
            num = 100;
        }
        return num;
    }
}

运行结果

try开始执行
finally执行
40

文本字符串改变时

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

    public static String test(){
        String num = "hello";

        try {
            System.out.println("try开始执行");
            return num+=" world";
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            System.out.println("finally执行");
            num = "change";
        }
        return num;
    }
}

运行结果

try开始执行
finally执行
hello world

引用数据类型改变时

public class TryTest4 {
    public static void main(String[] args) {
        System.out.println(test().num);
    }

    public static Num test(){
        Num number = new Num();
        try {
            System.out.println("try开始执行");
            return number;
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            System.out.println("finally执行");
            number.num = 100;
        }
        return number;
    }
}

class Num {
    public int num = 10;
}

运行结果

try开始执行
finally执行
100

当被改变的是引用数据类型时,则会改变返回的值

总结

1.finally中有return时,直接覆盖之前的renturn

2.finally中没有return时,则返回之前的return

3.finally中没有return时,但是改变了返回数据的值时:

  • 如果finally中改变的返回数据的类型为基本数据类型或者文本字符串时,返回值不改变
  • 如果finally中改变的返回数据类型为引用数据类型时,返回值改变
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值