try、catch、finally 用法总结

前言

  在开发过程中异常处理是经常用到的,相信大部分使用try、catch、finally的只知道try中出现异常catch中会捕获,finally块中代码何时都会执行。其实其中还有很多细微的知识点,下面我们来学习学习。

try、catch、finally执行顺序

  try块和catch块中逻辑基本相同。try中出现异常跳转到catch,若catch中出现异常则跳转到finally,try或catch正常执行若存在return则先执行return的代码并保存返回值信息(基本类型保存值信息,引用类型则保存地址信息下面会说明)然后执行finally,若finally中出现异常或包含return则执行结束,若无异常且没有return则会执行try或catch中的return或结束。整体执行流程如下:
try-catch-finally 流程图

说明与代码展示

  当try-catch-finally中无return时,如果try块中出现异常则进入catch中,执行完catch中代码后进入finally,如果catch中出现异常仍然会执行finally代码块,finally块执行结束后抛出异常。try块中无异常时执行完try块直接执行finally。
以catch中抛出异常为例,代码如下:

public static int testNoReturn(){
        int res = 1;
        try{
            res++;
            System.out.println("try ======== res:"+res);
            int a = 1/0;
        }catch (Exception e){
            res++;
            System.out.println("catch ======== res:"+res);
            int a = 1/0;
        }finally {
            res++;
            System.out.println("finally ======== res:"+res);
        }
        return res;
    }

  catch中抛出异常后finally仍然会执行,执行结束后抛出catch中的异常。执行结果如下:
catch中抛出异常 result
  try或catch中存在return 时流程基本一致所以合到一起讲下。finally中包含return时会覆盖try或catch中的return值,而且会覆盖catch中抛出的异常信息。
try或catch包含return,返回值为基本数据类型代码如下:

 public static int testTryCatchReturn(){
        int res = 1;
        try{
            res++;
            System.out.println("try ======== res:"+res);
            int a=1/0;
            return res;
        }catch (Exception e){
            res++;
            System.out.println("catch ======== res:"+res);
            return res;
        }finally {
            res++;
            System.out.println("finally ======== res:"+res);
        }
    }

执行结果如下:
try或catch中有return,返回值为基本数据类型 result
try或catch包含return,返回值为引用数据类型代码如下:

public static List testTryCatchReturn1(){
        List res = new ArrayList();
        try{
            res.add(1);
            System.out.println("try ======== res:"+res);
            int a=1/0;
            return res;
        }catch (Exception e){
            res.add(2);
            System.out.println("catch ======== res:"+res);
            return res;
        }finally {
            res.add(3);
            System.out.println("finally ======== res:"+res);
        }
    }

执行结果如下:
try或catch中有return,返回值为引用数据类型 result
finally中将引用的返回值赋值为null时代码如下:

public static List testTryCatchReturn1(){
        List res = new ArrayList();
        try{
            res.add(1);
            System.out.println("try ======== res:"+res);
            int a=1/0;
            return res;
        }catch (Exception e){
            res.add(2);
            System.out.println("catch ======== res:"+res);
            return res;
        }finally {
            res.add(3);
            System.out.println("finally ======== res:"+res);
            res = null;
            System.out.println("finally ======== res:"+res);
        }
    }

执行结果如下:
finally中奖引用类型返回值赋值为null result

  try或catch中存在return时会将返回值进行保存(基本数据类型直接保存,引用数据类型则保存引用地址),然后执行finally块中的代码,finally块中代码执行结束后直接返回。因为引用类型返回时保存的是地址,所以修改引用对象时返回信息会发生变化,但如果赋值为null时地址指向的信息并未发生变化所以返回值依然是地址指向的对象。
  当finally中存在return时会覆盖try或catch中返回的数据。如果catch中抛出异常时会将该异常覆盖掉。以catch中存在异常的情况为例,代码如下:

public static int testFinallyReturn(){
        int res = 1;
        try{
            res++;
            System.out.println("try ======== res:"+res);
            int a=1/0;
            return res;
        }catch (Exception e){
            res++;
            System.out.println("catch ======== res:"+res);
            int a = 1/0;
            return res;
        }finally {
            res++;
            System.out.println("finally ======== res:"+res);
            return res;
        }
    }

执行结果如下:
finally中存在retutn catch中抛出异常 result
finally的return会覆盖catch或try的return和异常信息。

总结

  1、无return且未出现异常时try->finally,出现异常时try->catch->finally。
  2、try或catch中有return时,返回数据为基本类型则finally代码块执行完后不会更改,返回值为引用类型,return保存的是引用地址,finally块中代码执行完会改变返回值。
  3、finally中存在return时会覆盖try或catch中的返回值信息,若try或catch中抛出异常也会被finally中的return覆盖。

  • 38
    点赞
  • 153
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
### 回答1: try catch finallyJava 语言中常用的异常处理机制。try 块用于包含可能会抛出异常的代码,catch 块用于处理 try 块抛出的异常,finally 块用于在程序结束之前执行一些代码,即使发生异常也会执行。 ### 回答2: 在JAVA语言中,try catch finally块用于捕获和处理异常。try块中放置可能会抛出异常的代码,catch块用于处理已被抛出的异常,finally块用于无论是否有异常都会执行的代码。 try块中的代码会逐行执行,如果发生异常,会立即跳出try块并寻找与异常类型匹配的catch块。catch块可以多个连续写,分别捕获不同种类的异常,也可以只写一个catch块来处理多种异常类型。catch块可以在捕获到异常后执行一系列处理操作,比如打印异常信息、记录日志等。 finally块中的代码无论是否发生异常,都会被执行。通常在finally块中放置一些必须执行的代码,比如资源的释放、文件的关闭等。即使try块中有return语句,finally块中的代码也会在方法返回之前被执行。 try catch finally块的执行流程如下: 1. 执行try块中的代码。 2. 如果发生异常,跳到与异常类型匹配的catch块。 3. 执行catch块中的代码。 4. 如果catch块中有return语句,会先执行finally块,再返回值。 5. 如果没有异常或者异常已在catch块中被处理,跳过catch块。 6. 执行finally块中的代码。 7. 返回try catch finally块之外的代码继续执行。 总之,try catch finally块是用于捕获和处理异常的关键字,可以帮助我们处理程序中可能发生的异常情况,保证程序的正常运行和资源的释放。 ### 回答3: try catch finally是一种在程序中处理异常的机制。try块用于标记可能会发生异常的代码块,catch块用于捕获并处理这些异常,finally块用于定义无论异常是否捕获都会执行的代码。 在try块中,如果发生异常,程序的执行会立即转到与该异常类型匹配的catch块。catch块会捕获异常对象,并根据需要执行相应的处理逻辑。通过捕获异常并进行处理,我们可以防止异常导致程序终止或出现不可预测的错误。 无论是否发生异常,finally块中的代码都会执行。finally块通常用于释放资源、关闭文件或数据库连接等必要的清理工作。可以保证不管代码是否发生异常,这些资源都能被正常释放,避免资源泄漏。 try catch finally块可以嵌套使用,内层的catch块可以处理外层catch块未处理的异常。通过多个catch块的嵌套,我们可以捕获并处理不同类型的异常,并根据实际情况做出相应的处理。 然而,需要注意的是,如果异常在try块中被抛出,但在catch块中未得到处理,程序仍然会终止并抛出未捕获的异常。因此,在使用try catch finally时,我们应该确保所有可能发生异常的代码都被包含在try块中,并在catch块中针对不同类型的异常进行相应的处理,以确保程序的稳定性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值