广告
返回顶部
首页 > 资讯 > 精选 >Java中try-catch-finally执行顺序是什么
  • 927
分享到

Java中try-catch-finally执行顺序是什么

2023-07-02 10:07:09 927人浏览 独家记忆
摘要

本文小编为大家详细介绍“Java中try-catch-finally执行顺序是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java中try-catch-finally执行顺序是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入

本文小编为大家详细介绍“Java中try-catch-finally执行顺序是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java中try-catch-finally执行顺序是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

正文

这里共列举五种情况,会对其一一说明。

try块中有return

try{    System.out.println("try块代码运行了");    return 0;}catch(Exception e){    System.out.println("catch块代码运行了");}finally {    System.out.println("finally块代码运行了");}return 1;

输出结果:

try块代码运行了
finally块代码运行了

最终返回:0

执行流程:

执行try块中return前(包括return语句中的表达式运算)的代码 -> 执行finally块 -> 执行try中return。

结论:

当try中带有return时,会先执行return前的代码,然后暂时保存需要return的信息,再执行finally中的代码,最后再通过return返回之前保存的信息。finally块之后的语句return不再执行,因为程序在try中已经return过了,方法的执行已经结束。

但有一点需要注意,如果返回值是引用类型呢?再看另外一个例子:

List<Integer> list = new ArrayList<>();try {    list.add(0);    System.out.println("try:" + list);    return list;} catch (Exception e) {    list.add(1);    System.out.println("catch:" + list);} finally {    list.add(2);    System.out.println("finally:" + list);}return list;

输出:

try:[0]
finally:[0,2]

最终返回:[0,2]

看完这个例子,可能会发现问题,刚提到return时会临时保存需要返回的信息,不受finally块中代码的影响。但是在这里,list里存的不是变量本身,而是变量的地址,所以当finally通过地址改变了变量,还是会影响方法返回值的。

catch块中有return

try{    System.out.println("try块代码运行了");    //int x = 1 / 0 ;}catch(Exception e){    System.out.println("catch块代码运行了");    return 0;}finally {    System.out.println("finally块代码运行了");}return 1;

输出结果:

//无异常
try块代码运行了
finally块代码运行了
    
最终返回:1
//有异常
try块代码运行了
catch块代码运行了
finally块代码运行了
    
最终返回:0

执行流程:

程序先执行try,如果遇到异常执行catch块。

有异常:执行catch中return之前(包括return语句中的表达式运算)代码,再执行finally语句中全部代码,最后执行catch块中return, finally之后的return不再执行。

无异常:执行完try再finally再return。

结论:

catch中return与try中类似,若出现异常,会暂时保存catch块中return的信息,再执行finally中的代码,最后再通过return返回之前保存的信息。

try块和finally块中有return

try{    System.out.println("try块代码运行了");    return 0;}catch(Exception e){    System.out.println("catch块代码运行了");}finally {    System.out.println("finally块代码运行了");    return 1;}

输出结果:

try块代码运行了
finally块代码运行了
    
最终返回:1

执行流程:

程序执行try块中return之前(包括return语句中的表达式运算)代码,再执行finally块。因为finally块中有return所以提前退出,而不再执行try中的return。

备注:

这种写法是可以编译通过的,但是编译器会给予警告。我们一般不在finally块中写return语句,这里只是刻意演示了一下效果。

catch块和finally块中有return

try{    System.out.println("try块代码运行了");    //int x = 1 / 0 ;}catch(Exception e){    System.out.println("catch块代码运行了");    return 0;}finally {    System.out.println("finally块代码运行了");    return 1;}

输出结果:

//无异常
try块代码运行了
finally块代码运行了
    
最终返回:1

//有异常
try块代码运行了
catch块代码运行了
finally块代码运行了
    
最终返回:1

执行流程:

无异常:执行try后跳过catch执行finally,得到finally的返回值1;

有异常:程序执行catch块中return之前(包括return语句中的表达式运算)代码,再执行finally块。因为finally块中有return所以提前退出,而不再执行catch中的return。

try块、catch块和finally块中都有return

try{    System.out.println("try块代码运行了");    //int x = 1 / 0 ;    return 0;}catch(Exception e){    System.out.println("catch块代码运行了");    return 1;}finally {    System.out.println("finally块代码运行了");    return 2;}

输出结果:

//无异常
try块代码运行了
finally块代码运行了

最终返回:2
    
//有异常
try块代码运行了
catch块代码运行了
finally块代码运行了

最终返回:2    

执行流程:

程序执行try块中return之前(包括return语句中的表达式运算)代码,

无异常:然后再执行finally块,因为finally块中有return所以提前退出;

有异常:执行catch块中return之前(包括return语句中的表达式运算)代码,再执行finally块。因为finally块中有return所以提前退出

结论:

得到finally中的返回值3。

总结

  • 无论catch是否捕获异常,finally语句块都是要被执行的。

  • 当try块或catch块return一个值,那么finally块中的代码会在执行return后,返回之前执行。(此时并没有返回运算后的值,而是把要返回的值暂时保存起来)。

  • finally中如果包含return,那么程序将在这里返回,而不是通过try或catch中的return返回,返回值就不是try或catch中保存的返回值了。会直接在finally中结束方法的执行,导致try、catch中的return失效

  • 当try或catch,finally中都包含return的时候,要注意返回值的类型。finally修改的基本类型是不影响返回结果的,修改list、map、自定义类等引用类型时,是影响返回结果的。

  • 编译器会对finally中的return给予警告,因为从finally中返回可能会导致异常丢失 。如:

    try{    try    {        throw new RuntimeException("来自try块中的异常") ;    }finally{          return;    }}catch (Exception e){    e.printStackTrace(System.out) ;}

    这里无法捕获 我们自定义的运行时异常。

    又如:

    try{    try    {        throw new RuntimeException("来自try块中的异常") ;    }finally{        throw new RuntimeException("来自finally块中的异常") ;    }}catch (Exception e){    e.printStackTrace(System.out) ;}

    这里会丢失 第一个异常。

读到这里,这篇“Java中try-catch-finally执行顺序是什么”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

--结束END--

本文标题: Java中try-catch-finally执行顺序是什么

本文链接: https://www.lsjlt.com/news/341328.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java中try-catch-finally执行顺序是什么
    本文小编为大家详细介绍“Java中try-catch-finally执行顺序是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java中try-catch-finally执行顺序是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入...
    99+
    2023-07-02
  • Java中try-catch-finally执行顺序你知道吗
    目录引言正文try块中有returncatch块中有returntry块和finally块中有returncatch块和finally块中有returntry块、catch块和fin...
    99+
    2022-11-13
  • java异常处理执行顺序详解try catch finally
    目录不含return的执行顺序finally子句 含return的执行顺序返回类型是对象类型时值的变化结论不含return的执行顺序 执行顺序为执行try中代码,如果没有异常,然后执...
    99+
    2022-11-12
  • try catch finally的执行顺序深入分析
    首先执行try,如果有异常执行catch,无论如何都会执行finally 一个函数中肯定会执行finally中的部分。 关于一个函数的执行过程是,当有return以后,函数就会把这个...
    99+
    2022-11-15
    try catch finally 执行顺序
  • Java中try-catch-finally语法块的执行顺序是怎样的
    这篇文章主要讲解了“Java中try-catch-finally语法块的执行顺序是怎样的”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中try-catch-finally语法块的执行...
    99+
    2023-06-03
  • Java的try、catch、finally语句中有return各类情况是什么
    本篇内容主要讲解“Java的try、catch、finally语句中有return各类情况是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java的try、catch、finally语句中有...
    99+
    2023-06-16
  • 深入浅析Java中finally语句与return的执行顺序
    深入浅析Java中finally语句与return的执行顺序?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。(1)try语句没有被执行到,如在try语句之前就返回了,这样fina...
    99+
    2023-05-31
    java return finally
  • java过滤器执行顺序是什么
    Java过滤器的执行顺序是根据过滤器的配置顺序来确定的。在web.xml文件中,过滤器的配置顺序决定了它们的执行顺序。当一个请求被发...
    99+
    2023-08-11
    java
  • java中代码块的执行顺序是什么
    java中代码块的执行顺序是什么?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。常用的java框架有哪些1.SpringMVC,Spring Web MVC是一种基于Java...
    99+
    2023-06-14
  • java代码块的执行顺序是什么
    Java代码块的执行顺序如下: 静态代码块:静态代码块在类加载时执行,并且只执行一次。它用来初始化静态变量或执行一些只需执行一次...
    99+
    2023-10-24
    java
  • java构造器的执行顺序是什么
    这篇文章给大家介绍java构造器的执行顺序是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1,在没有静态块的情况下,子类的对象创建时,父类的无参构造器-->子类的构造器(产生对象的构造器,如果是无参则执行的是...
    99+
    2023-06-17
  • mysql的执行顺序是什么
    mysql的执行顺序是什么?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1、执行顺序根据查询指定的表格,from计算笛卡尔积。on根据join_condition过滤数据。...
    99+
    2023-06-14
  • ​mysql中语句执行顺序是什么
    这篇文章给大家分享的是有关mysql中语句执行顺序是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。MySQL的语句一共分为11步,如下图所标注的那样,最先执行的总是FROM操...
    99+
    2022-10-18
  • Java监听器MouseListener的执行顺序是什么
    Java监听器MouseListener的执行顺序是按照以下顺序执行的:1. 鼠标按下事件:mousePressed()2. 鼠标释...
    99+
    2023-08-16
    Java
  • Java监听器ActionListener的执行顺序是什么
    Java监听器ActionListener的执行顺序是按照事件的触发顺序来决定的。当事件发生时,监听器会按照注册顺序依次执行。例如,...
    99+
    2023-08-16
    Java
  • golang defer的执行顺序是什么
    在Go语言中,defer语句用于注册延迟调用,延迟调用会在函数执行完毕后被执行,无论函数是正常返回还是发生异常。 当有多个defer...
    99+
    2023-10-22
    golang
  • switch语句执行顺序是什么
    switch语句执行顺序是按照case标签的顺序进行判断,从上到下逐个比较。当找到与表达式匹配的case标签时,会执行该case标签...
    99+
    2023-09-16
    switch
  • sql和mysql执行顺序是什么
    这篇文章主要介绍了sql和mysql执行顺序是什么,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。sql和mysql执行顺序,内部机制是一样的,最...
    99+
    2022-10-18
  • SQL查询的执行顺序是什么
    本篇内容主要讲解“SQL查询的执行顺序是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SQL查询的执行顺序是什么”吧!很多 SQL 查询都是以 SELEC&...
    99+
    2022-10-19
  • JS异步的执行顺序是什么
    这篇文章主要介绍“JS异步的执行顺序是什么”,在日常操作中,相信很多人在JS异步的执行顺序是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JS异步的执行顺序是什么”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-07-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作