随笔01---关于try catch块中的两个问题

参考文章

①关于finally代码块的抛出异常问题
②finally代码块一定会执行吗?


一、关于try catch中抛异常的问题

1、try catch 代码块中的finally中很不建议抛异常,可用log打印到日志中
代码如下:

public static void throwException(){
        File file = null;
        FileInputStream fis = null;
        try{
            file = new File("123.txt");
            fis = new FileInputStream(file);
            fis.read();
        }catch(FileNotFoundException e){
            e.printStackTrace();
        }catch(IOException e){
            e.printStackTrace();
        } finally{
            // 这里存在一个的异常,需要进行处理
            try {
                 if(fis != null){
                    fis.close();
                }
            } catch (IOException e) {
               log.error("关闭连接异常",e);
            }
        }
    }

2、也可以把catch放在最外层

public static void throwException(){
        File file = null;
        FileInputStream fis = null;
        try{
            try {
                file = new File("abc.txt");
                fis = new FileInputStream(file);
                fis.read();
            }  finally {
                if(fis != null){
                    fis.close();
                }
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

建议只要是打印异常信息的时候:

  • 不要使用e.printStackTrace();
    (因为这种方式会把异常信息存在内存中,开发大忌。抛出的信息会很多,刷控制台,占内存。会引发字符串常量池所在的内存块没有空间)
  • 可以用log.error(); 代替打印到日志中。(强烈建议)

PS:上面例子中的e.printStackTrace(); 举例方便下,其实很不可取。

二、关于try catch finally中的return关系

finally中的代码一定会被执行(以下特殊情况除外:还没执行到try代码块就return或者终止;执行到finally代码块断电宕机等)

  • try catch中的return只是先将值保存下来,等finally块执行完,才会return。
  • 当try中报异常后,不会执行try的return,会被catch捕获,并return catch的值。
  • 但如果finally中也有return语句,则try catch中被覆盖,采用finally块的。
  • 如果finally块没有return语句,那即使对try catch块中的return值做更改,也不会改变最终的return值。

例子如下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值