JAVA小知识点-Finally和Return的执行关系

如果Try和Catch中存在return语句的时候Finally内的语句是否会执行,执行的时候对结果又有什么影响呢?我写了个例子来试验这个问题:

public static Map<String, String> getMapTry() {
        Map<String, String> map = new HashMap<String, String>();
        map.put("KEY", "INIT");

        try {
            map.put("KEY", "TRY");
            return map;
        }
        catch (Exception e) {
            map.put("KEY", "CATCH");
            e.printStackTrace();
        }
        finally {
            map.put("KEY", "FINALLY");
        }

        System.out.println("---------end--------");
        return map;
    }

public static Map<String, String> getMapCatch() {
        Map<String, String> map = null;

        try {
            map.put("KEY", "TRY");
        }
        catch (Exception e) {
            map = new HashMap<>();
            map.put("KEY", "CATCH");
            e.printStackTrace();
            return map;
        }
        finally {
            map.put("KEY", "FINALLY");
        }
        System.out.println("---------end--------");
        return map;
}

public static int getInt() {
        Map<String, String> map = null;
        int ret =0;
        try {
            map.put("KEY", "TRY");
            ret = 1;
        }
        catch (Exception e) {
            map = new HashMap<>();
            map.put("KEY", "CATCH");
            e.printStackTrace();
            return ret;
        }
        finally {
            map.put("KEY", "FINALLY");
            ret =3;
        }
        System.out.println("---------end--------");
        return ret;
    }

    public static void main(String[] args) {
        System.out.println("try:" + getMapTry().get("KEY").toString());
        System.out.println("catch:" + getMapCatch().get("KEY").toString());
        System.out.println("int:" + getInt());

}

执行结果:

try:FINALLY
java.lang.NullPointerException
  at com.wmshua.test.FinallyReturnRelation.getMapCatch(FinallyReturnRelation.java:43)
  at com.wmshua.test.FinallyReturnRelation.main(FinallyReturnRelation.java:14)
catch:FINALLY
java.lang.NullPointerException
  at com.wmshua.test.FinallyReturnRelation.getInt(FinallyReturnRelation.java:63)
  at com.wmshua.test.FinallyReturnRelation.main(FinallyReturnRelation.java:15)
int:0

结果分析:

引用类型发生了变化,基本数据类型没有修改。

从执行结果得出以下结论:

  1. finally 即使在try或者catch中存在 return 且执行的情况下也会执行。
  2. finally 对变量的修改发生在方法调用结束之前。
  3. return 语句是在 finally 之前执行的。
  4. return 的返回结果并不是返回原数据而是对原有数据的拷贝,基本数据类型拷贝基本类型值,引用类型拷贝引用而不拷贝引用内的值。
  5. finally 内语句能够影响引用类型但不会影响基本数据类型。
时间: 2024-10-27 13:23:17

JAVA小知识点-Finally和Return的执行关系的相关文章

转:Java中finally和return的执行关系

finally可以分两方面理解 1.执行时机问题.finally总会执行(除非是System.exit()),正常情况下在try后执行,抛异常时在catche后面执行 2.返回值问题.可以认为try(或者catch)中的return语句的返回值放入线程栈的顶部:如果返回值是基本类型则顶部存放的就是值,如果返回值是引用类型,则顶部存放的是引用.finally中的return语句可以修改引用所对应的对象,无法修改基本类型.但不管是基本类型还是引用类型,都可以被finally返回的“具体值”具体值覆盖

菜鸟之Java小知识点--冒泡排序详解

冒泡排序额思想简单来说就是:相邻两个数比较,将最大额或者最小的放在最后 下面分析一个数组[21,78,52,18,34,11]进行从大到小排序. 如下图.为第一轮比较的过程,依次比较相邻两个元素,第一轮比较完后将最大的78放在了最后 第一轮:比较了5次,交换 4次 第二轮:比较了4次,交换 3次 第三轮:比较了3次,交换 1次 第四轮:比较了2次,交换 1次 第五轮:比较了1次,交换 1次 统计:6个元素总共比较了5轮,比较了15次,交换 10次 公式:比较轮数=n-1轮, 比较次数=n*(n-

java 小知识点

1.转Java中Vector和ArrayList的区别 首先看这两类都实现List接口,而List接口一共有三个实现类,分别是ArrayList.Vector和LinkedList.List用于存放多个元素,能够维护元素的次序,并且允许元素的重复.3个具体实现类的相关区别如下: ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问.数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能力,就要讲已经有数组的数据复制到新的存储空间中.当从Ar

Java小知识点

1.将字符串变成整数,一般在算法中涉及到大数计算时需要用到 class test { public static void main(String[] args) { String s="233123"; int i=Integer.parseInt(s); //当s里面有非数字的时候会出错 System.out.println(i); } } 2.对于负数的处理,先判断是否为负,然后去掉负号进行计算,在计算完之后加上 class test { public static void m

java小知识点1

char占2Byte,采用utf-16编码. java可以使用中文当做变量名,因为java的字符集是unicode. 导入一个类下所有的静态方法:import static java.lang.Math.* 虚箭头表示可能有精度损失,注意int->float可能有损失,long->double可能有损失. System.out.println((int) 1.1 - 0.1); >>>0.9,表示强制类型转换优先级大于运算符. 当字符串与任意一个非字符串的值连接,非字符串的值

JAVA小知识点记录

1.Mah.ceil() * Returns the smallest (closest to negative infinity) * {@code double} value that is greater than or equal to the * argument and is equal to a mathematical integer. Special cases: * If the argument value is already equal to a * mathemati

java小知识点(一)---Java中获取键盘输入值的三种方法

Java中获取键盘输入值的三种方法   程序开发过程中,需要从键盘获取输入值是常有的事,但Java它偏偏就没有像c语言给我们提供的scanf(),C++给我们提供的cin()获取键盘输入值的现成函数!Java没有提供这样的函数也不代表遇到这种情况我们就束手无策,请你看以下三种解决方法吧:   以下将列出几种方法:   方法一:从控制台接收一个字符,然后将其打印出来   publicstatic void main(String [] args) throws IOException{   Sys

java小知识点7

进程:每个进程拥有自己的一整套变量 线程:共享数据 调用Thread.sleep不会创建一个新的线程,sleep是Thread类的静态方法,用于暂停当前线程. 定义线程建议通过Runnable接口,继承Thread无法继承其它的类. 线程的stop方法已经被弃用.请求线程终止,使用interrupt方法 如果线程正在运行,调用interrupt方法,中断状态置位 线程被阻塞,调用interrupt方法,抛出InterruptException 线程状态: new runnable blockin

java小知识点3

调用对象方法的执行过程: 编译器查看调用对象的类型和方法名 编译器查看调用方法时提供的参数类型 如果是静态绑定方法(private.static.final),编译器可以直接确定下来 虚拟机调用x实际对象最适合那个类的方法 将方法或者类声明为final的意义:确保他们不会在final中改变语义 protected的讨论:子类不能访问其他对象的protected域