try-catch-finally需要注意的点
- try不能单独存在!必须至少搭配一个catch或者finally
- 如果有finally,即便try或者catch,return,在return之前还是会先走finally里面代码
- 如果对于
基本数据类型
,如果在try里面比如把i修改为2,然后return i, 然后再finally里面我们又操作i=3,此时返回的是i=2;因为return要返回的值在finally执行之前会拷贝一份 - 但是如果finally里面修改完之后也return了,那么就会被覆盖掉了
- 对于
引用类型变量
,如果我们同时在try和finally里面修改某个属性,那么这个修改会被覆盖,但是如果我们同时在try和finally里面new了一个对象,并且赋给原对象,同理,返回的是try里面的引用变量 - 并不是说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 + '\'' +
'}';
}
}