异常捕获
当我们写代码时,必然会出现各种各样的问题,问题出现后程序崩溃了我们该怎么做呢?在我们写代码的时候觉得可能出现问题的地方进行try…catch…进行异常捕获。而且作为面试题经常被问到的finally让我们一起来了解一下吧!
格式
try{
//需要执行的代码
}catch(Exception e){
//处理代码可能出现的异常
}finally{
//必然执行的代码
}
finally里面的内容必然执行,那什么情况下finally不执行呢?
1.在程序还没有执行到finally时内存关闭了程序停止了。比如电脑死机、停电什么的
2.在catch中执行了System.ecxt(0);正常退出程序也不会再执行finally
让我们看一下这下面的几种情景来加深我们对finally的理解吧!
情景一
当代码中有return时finally还会执行吗?
try {
int a=10;
int b=2;
System.out.println(a/b);
return;
}catch (RuntimeException e){
System.out.println("出现异常");
}finally {
System.out.println("必然执行");
}
会,finally作为异常的统一出口,不管是否产生 了异常,最终都要执行此段代码。
运行效果
情景二
下面代码输出时是多少呢?
public static void main(String[] args) {
int num= show();
System.out.println(num);
}
public static Integer show() {
int a = 10;
try {
return a;
} catch (RuntimeException e) {
return null;
} finally {
a = 20;
}
}
运行截图
finally是必然执行的,为什么最后输出的还是10呢?
因为a创建时在栈空间中,return返回时对a的值进行备份,此时a是10,return等待finally执行完后返回,finally对a进行修改后不影响对a的备份,所以输出10
情景三
下面代码输出时是多少呢?
public class Test1 {
public static void main(String[] args) {
Person p=new Person();
try {
p.age = 18;
} catch (Exception e) {
System.out.println(e);
}finally {
p.age = 28;
}
System.out.println(p.getAge());
}
}
class Person{
int age;
public int getAge() {
return age;
}
}
运行截图
finally是必然执行的,为什么最后输出的不是18呢?
因为初始化对象时对象名存在栈中,对象信息在堆中开辟了一块空间,对象名指向堆中的内存地址,p.age = 18;是对堆中的age进行的赋值;当finally中p.age = 28;也是修改同一内存地址中的age值,所以最后输出也是通过这个内存地址找到的空间取得值,也就输出了28
小小理解,欢迎指正!