final和finally的使用

1.引言

​ final关键字是Java中的修饰符,用于修饰类,局部变量,成员变量和成员方法。

用法

final修饰类:该类不能被继承
final修饰局部变量:变量中的数值(基本数据类型)或地址(引用数据类型)不可以被改变。在声明时,就必须赋值。
final修饰成员变量:可以先声明,再赋值,但只能赋值一次。赋值后不能改变。
final修饰方法时:该方法不能被子类重写

2.引言

​ finally语句是接在异常处理之后的,作为一个必然执行的异常统一处理出口。无论是否发生异常,finally语句必然执行。

语法格式

try{
// 有可能发生异常的代码段
}catch(异常类型1 对象名1){
// 异常的处理操作
}catch(异常类型2 对象名2){
// 异常的处理操作
} ...
finally{
// 异常的统一出口
}
1. try-catch-finally中哪一部分可以省略
catch和finally可以省略其中的一个,但catch和finally不能同时省略
2. finally内的语句不会被执行或者没有被完全执行的情况
1.finally语句块中发生了异常
2.在finally前面的代码中使用了System.exit()退出了程序,JVM被关闭了。
3.finally所在的程序块线程死亡。
4.程序执行到finally之前,电脑关闭或CPU关闭
3. try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?

finally会被执行,以下例子展示常见两种情况。

/*执行流程:
*1. 先计算返回值, 并将返回值存储起来, 等待返回
*2. 执行finally代码块
*3. 将之前存储的返回值, 返回出去;
*注意:被缓存的的是变量栈中的值,如果该值有引用对象,则在返回值被存储后,依然可以用finally中语句对该值的引用内容做改变。如果该值是基本数据类型,不管finally对该值做任何的改变,返回的值都不会改变。
*/
public class Test {
    public static void main(String[] args) {
        int a = 10;
        int b = 0;
        div(a,b);
        System.out.println(b);//打印出来b的值为0,fianlly没有改变之前被缓存的b的值
        Card card = new Card("球星卡");
        Card newCard = setPrice(card);
        System.out.println(newCard.price);//打印1,说明c的引用对象里的属性在fianlly语句块中被改变,其实c的内容并没有被改变,它依然指着原来的内存地址,其指的对象在堆中,堆中的对象的值被改变了      
    }
    public static int div(int a, int b){
        try{
            System.out.println(a/b);
        }catch(RuntimeException e){
            return b;
        }finally {
            b = 5;
           	System.out.println(b);//打印出来5,说明finally中的语句被执行了
        }
        return b;
    }
    public static Card setPrice(Card c){
        try{
            c.price = 10000;
            return c;
        }catch(Exception e){
        }finally {
            c.price = 1;
            System.out.println("已修改价格");//会执行打印内容
        }
        return c;
    }
}
class Card{
    public int price;
    public String name;

    public Card(String name) {
        this.name = name;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值