Java基础之finally语句与return语句详解

 更新时间:2021年04月26日 14:16:37   作者:星光_依旧灿烂  
这篇文章主要介绍了Java基础之finally语句与return语句详解,文中有非常详细的代码示例,对正在学习java基础的小伙伴们有非常好的帮助,需要的朋友可以参考下

一、return语句执行顺序

finally语句是在return语句执行之后,return语句返回之前执行的

package exception;

public class Demo06 {
    public static void main(String[] args) {
        System.out.println(func());
    }

    public static int func(){
        int a = 10;
        try{
            System.out.println("try中的代码块");
            return a += 10;
        }catch (Exception e){
            System.out.println("catch中的代码块");
        }finally {
            System.out.println("finally中的代码块");
            if(a > 10){
                System.out.println("a > 10,"+"a="+a);
            }
        }
        return a += 50;
    }
}

运行结果:

try中的代码块
finally中的代码块
a > 10,a=20
20

注意:

a > 10,a=20的结果说明了return a += 10已经执行了,但是没有直接返回,而是先去执行finally语句的内容,然后再去返回结果

二、覆盖问题

finally块中的return语句会覆盖try块的return返回

package exception;

public class Demo07 {
    public static void main(String[] args) {
        System.out.println(func());
    }

    public static int func(){
        int a = 10;
        try{
            System.out.println("try中的代码块");
            return a += 10;
        }catch (Exception e){
            System.out.println("catch中的代码块");
        }finally {
            System.out.println("finally中的代码块");
            if(a > 10){
                System.out.println("a>10,"+"a="+a);
            }
            return 100;
        }
    }
}

运行结果:

try中的代码块
finally中的代码块
a>10,a=20
100

注意:

(1)如果try中有return语句,finally中也有return语句,最终执行的是finally中的return语句
(2)如果finally代码块中写了return语句,那么finally之后的return语句就变成不可到达的语句,需要注释掉,否则编译不过

如果finally语句没有return语句覆盖返回值,那么原来的返回值可能因为finally里的修改而改变也有可能不变

(1)测试1

package exception;

public class Demo08 {
    public static void main(String[] args) {
        System.out.println(func());
    }

    public static int func(){
        int a = 10;
        try{
            System.out.println("try中的代码块");
            return a += 20;
        }catch (Exception e){
            e.printStackTrace();
            System.out.println("catch中的代码块");
        }finally {
            System.out.println("finally中的代码块");
            a  += 20;
            if(a > 10){
                System.out.println("a > 10,a="+a);
            }
            a += 20;
        }
        return 200;
    }
}

运行结果:

try中的代码块
finally中的代码块
a > 10,a=50
30

注意:

对于基本数据类型来说,finally中对返回值的修改不会影响try中的返回变量的值

(2)测试2

package exception;

import java.util.HashMap;
import java.util.Map;

public class Demo09 {
    public static void main(String[] args) {
        System.out.println(getMap().get("KEY").toString());
    }

    public static Map<String,String> getMap(){
        Map<String,String> map = new HashMap<>();
        map.put("KEY","INIT");
        try{
            map.put("KEY","try");
            return map;
        }catch (Exception e){
            e.printStackTrace();
            map.put("KEY","catch");
        }finally {
            map.put("KEY","finally");
            map = null;
        }
        return map;
    }
}

运行结果:

finally

注意:

对于引用数据类型来说,finally中对返回值的修改会影响try中的返回变量的值

三、异常情况

try块中的return语句在异常的情况下不会被执行

package exception;

public class Demo10 {
    public static void main(String[] args) {
        System.out.println(func());
    }

    public static int func(){
        int a = 10;
        try{
            System.out.println("try中的代码块");
            a = a/0;
            return a += 50;
        }catch (Exception e){
            a += 15;
            System.out.println("catch中的代码块");
        }finally {
            System.out.println("finally中的代码块");
            if(a > 20){
                System.out.println("a > 20,a ="+a);
            }
            a += 10;
        }
        return a;
    }
}

运行结果:

try中的代码块
catch中的代码块
finally中的代码块
a > 20,a =25
35

注意:

try语句块中发生异常,try语句异常后的内容不会执行,return语句也不会执行,执行的是捕获到的catch语句块和finally语句块

try中发生异常时,return写在catch语句中

package exception;

public class Demo11 {
    public static void main(String[] args) {
        System.out.println(func());
    }

    public static int func(){
        int a = 10;
        try{
            System.out.println("try中的代码块");
            a = a /0;
            return a += 10;
        }catch (Exception e){
            System.out.println("catch中的代码块");
            return a += 15;
        }finally {
            System.out.println("finally中的代码块");
            if (a > 10){
                System.out.println("a > 10, a = "+a);
            }
            a += 50;
            System.out.println(a);
        }
    }
}

运行结果:

try中的代码块
catch中的代码块
finally中的代码块
a > 10, a = 25
75
25

注意:

try中发生异常之后,catch中的return语句先执行,确定了返回值之后(保存起来,finally中的语句对返回值无影响)再去finally语句块,执行完之后再返回a的值,finally中对a的修改对返回值无效

四、finally语句一定会被执行吗?

(1)当程序进入try语句之前就出现异常时,会直接结束

(2)try语句块中有强制退出时也不会执行finally语句块中的代码

System.exit(0);

代码示例:

package exception;

public class Demo12 {
    public static void main(String[] args) {
        int a = 10;
        try{
            System.out.println("try block");
            System.exit(0);
        }catch (Exception e){
            System.out.println("catch block");
        }finally {
            System.out.println("finally block");
        }
    }
}

运行结果:

try block

到此这篇关于Java基础之finally语句与return语句详解的文章就介绍到这了,更多相关java finally语句与return语句内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot中的@Conditional 注解的使用

    SpringBoot中的@Conditional 注解的使用

    @Conditional是Spring4新提供的注解,它的作用是按照一定的条件进行判断,满足条件的才给容器注册Bean,本文主要介绍了SpringBoot中的@Conditional 注解的使用
    2024-01-01
  • Java获取任意http网页源代码的方法

    Java获取任意http网页源代码的方法

    这篇文章主要介绍了Java获取任意http网页源代码的方法,可实现获取网页代码以及去除HTML标签的代码功能,涉及Java正则操作相关实现技巧,需要的朋友可以参考下
    2017-09-09
  • SpringBoot入门之集成Druid的方法示例

    SpringBoot入门之集成Druid的方法示例

    这篇文章主要介绍了SpringBoot入门之集成Druid的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • Mybatis之映射实体类中不区分大小写的解决

    Mybatis之映射实体类中不区分大小写的解决

    这篇文章主要介绍了Mybatis之映射实体类中不区分大小写的解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • SpringBoot 中html的页面间跳转问题小结

    SpringBoot 中html的页面间跳转问题小结

    这篇文章主要介绍了SpringBoot 中html的页面间跳转问题小结,本文给大家分享两种方法,结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-10-10
  • Java生成CSV文件实例详解

    Java生成CSV文件实例详解

    这篇文章主要介绍了Java生成CSV文件的方法,很实用的功能,需要的朋友可以参考下
    2014-07-07
  • 一文吃透 Spring 中的 AOP 编程

    一文吃透 Spring 中的 AOP 编程

    这篇文章主要介绍了springboot中的AOP编程,本文介绍的非常详细,有一定的参考价值,感兴趣的小伙伴可以借鉴一下
    2023-04-04
  • Android studio按钮点击页面跳转详细步骤

    Android studio按钮点击页面跳转详细步骤

    在Android应用程序中,页面跳转是非常常见的操作,下面这篇文章主要给大家介绍了关于Android studio按钮点击页面跳转的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • Feign踩坑源码解读之@FeignClient注入容器

    Feign踩坑源码解读之@FeignClient注入容器

    文章主要介绍了FeignClientsRegistrar类的作用和注册Feign客户端的过程,以及FeignClientFactoryBean的使用和目标对象的获取
    2024-11-11
  • Java web过滤器验证登录防止未登录进入界面

    Java web过滤器验证登录防止未登录进入界面

    这篇文章主要介绍了Java web过滤器验证登录防止未登录进入界面,在一些系统中经常可以用到此功能,对java web 验证登录知识感兴趣的朋友一起看下吧
    2016-08-08

最新评论