try-catch-finally需要注意的点,超详细讲解附代码演示

try-catch-finally需要注意的点

  1. try不能单独存在!必须至少搭配一个catch或者finally
  2. 如果有finally,即便try或者catch,return,在return之前还是会先走finally里面代码
  3. 如果对于基本数据类型,如果在try里面比如把i修改为2,然后return i, 然后再finally里面我们又操作i=3,此时返回的是i=2;因为return要返回的值在finally执行之前会拷贝一份
  4. 但是如果finally里面修改完之后也return了,那么就会被覆盖掉了
  5. 对于引用类型变量,如果我们同时在try和finally里面修改某个属性,那么这个修改会被覆盖,但是如果我们同时在try和finally里面new了一个对象,并且赋给原对象,同理,返回的是try里面的引用变量
  6. 并不是说finally一定会执行
    • 代码流程并未进入try语句块
    • 使用了 System.exit(int) 退出程序
    • 程序所在的线程死亡(干扰中断,或者程序外部kill该线程,或者是意外中止)

对于2,3,4,5下面附上代码演示,相信大家一看就懂

package com.cx330;

@SuppressWarnings("all")
public class Collection01 {
    public static void main(String[] args) {


        /*基本数据类型*/
        System.out.println(foo1());//res=>2
        System.out.println(foo2());//res=>3
        System.out.println(foo3());//res=>4
        System.out.println(foo4());//res=>3

        /*引用数据类型*/
        Student student = new Student(18, "Cx330");
        System.out.println(foo5(student));//Student{age=19, name='Cx332'}

        Student student2 = new Student(18, "Cx330");
        System.out.println(foo6(student2));//Student{age=20, name='Cx333'}

        Student student3 = new Student(18, "Cx330");
        System.out.println(foo7(student3));//Student{age=22, name='Cx334'}

    }

    public static int foo1() {
        int i = 1;
        try {
            i = 2;
            return i;
        } finally {
            i = 3;
            return i;
        }
    }

    public static int foo2() {
        int i = 1;
        try {
            i = 2;
            return i;
        } finally {
            i = 3;
            return i;
        }
    }

    public static int foo3() {
        int i = 1;
        try {
            i = 2;
            int c = 4 / 0;
            return i;
        } catch (Exception e) {
            i = 4;
            return i;
        } finally {
            i = 3;
        }
    }

    public static int foo4() {
        int i = 1;
        try {
            i = 2;
            int c = 4 / 0;
            return i;
        } catch (Exception e) {
            i = 4;
            return i;
        } finally {
            i = 3;
            return i;
        }
    }

    public static Student foo5(Student stu) {
        try {
            stu.age = 17;
            stu.name = "Cx331";
            return stu;
        } finally {
            stu.age = 19;
            stu.name = "Cx332";
        }
    }

    public static Student foo6(Student stu) {
        try {
            Student student = new Student(20, "Cx333");
            stu = student;
            return stu;
        } finally {
            Student student = new Student(22, "Cx334");
            stu = student;
        }
    }

    public static Student foo7(Student stu) {
        try {
            Student student = new Student(20, "Cx333");
            stu = student;
            return stu;
        } finally {
            Student student = new Student(22, "Cx334");
            stu = student;
            return stu;
        }
    }
}


class Student {
    Integer age;
    String name;

    public Student(Integer age, String name) {
        this.age = age;
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Student{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C_x_330

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值