基础用法:

int f1() {
    try{
        return 1;
    }finally {
       System.out.println("finall执行");
    }
}

@Test
public void testFinally() {
   System.out.println(f1());
}

输出:

finall执行
1

结论:try中返回函数时,finally会先执行。

// 返回普通变量,finally中修改无效
int f1() {
    int ret = 1;
    try {
        return ret;
    } finally {
        ret = 2;
        System.out.println("f1 finall执行");
    }
}
// 返回引用类型,finally中修改有效
int[] f2() {
    int[] ret = {1};
    try {
        return ret;
    } finally {
        ret[0] = 2;
        System.out.println("f2 finall执行");
    }
}
// return 的表达式在finally结束后才执行
int f3() {
    try {
        return 1 / 0;
    } finally {
        System.out.println("f3 finall执行");
    }
}

@Test
public void testFinally() {
    System.out.println(f1());
    System.out.println(Arrays.toString(f2()));
    System.out.println(f3());
}

输出:

f1 finall执行
1
f2 finall执行
[2]
f3 finall执行
java.lang.ArithmeticException: / by zero

结合以上f2(修改引用有效)和f3(return表达式延迟执行)的测试,会认为以下代码运行,得到的数据为空,但实际上不是:

List<String> list = new ArrayList<>();

List<String> f1() {
    try {
        return new ArrayList<>(list);
    } finally {
       list.clear();
       System.out.println("清空数据");
    }
}

@Test
public void testFinally() {
    list.add("123");
    System.out.println("返回数据:" + f1());
}

输出结果:

清空数据
返回数据:[123]

运行规律不好把握,所以实际使用中尽量避免这种写法,容易导致bug。

其他测试结论:同步函数中,finally未执行时,对象锁不会释放。

Java中的finally的更多相关文章

  1. java中的锁

    java中有哪些锁 这个问题在我看了一遍<java并发编程>后尽然无法回答,说明自己对于锁的概念了解的不够.于是再次翻看了一下书里的内容,突然有点打开脑门的感觉.看来确实是要学习的最好方式 ...

  2. java中的字符串相关知识整理

    字符串为什么这么重要 写了多年java的开发应该对String不陌生,但是我却越发觉得它陌生.每学一门编程语言就会与字符串这个关键词打不少交道.看来它真的很重要. 字符串就是一系列的字符组合的串,如果 ...

  3. Java中的Socket的用法

                                   Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...

  4. java中Action层、Service层和Dao层的功能区分

    Action/Service/DAO简介: Action是管理业务(Service)调度和管理跳转的. Service是管理具体的功能的. Action只负责管理,而Service负责实施. DAO只 ...

  5. Java中常用集合操作

    一.Map 名值对存储的. 常用派生类HashMap类 添加: put(key,value)往集合里添加数据 删除: clear()删除所有 remove(key)清除单个,根据k来找 获取: siz ...

  6. java中的移位运算符:<<,>>,>>>总结

    java中有三种移位运算符 <<      :     左移运算符,num << 1,相当于num乘以2 >>      :     右移运算符,num >& ...

  7. 关于Java中进程和线程的详解

    一.进程:是程序的一次动态执行,它对应着从代码加载,执行至执行完毕的一个完整的过程,是一个动态的实体,它有自己的生命 周期.它因创建而产生,因调度而运行,因等待资源或事件而被处于等待状态,因完成任务而 ...

  8. Java中的进程和线程

     Java中的进程与线程 一:进程与线程 概述:几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进程运行时,内部可能包括多个顺序执行流,每个顺序执行流就是 ...

  9. Java中的进程与线程(总结篇)

    详细文档: Java中的进程与线程.rar 474KB 1/7/2017 6:21:15 PM 概述: 几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进 ...

  10. 初探java中this的用法

    一般this在各类语言中都表示“调用当前函数的对象”,java中也存在这种用法: public class Leaf { int i = 0; Leaf increment(){ i++; retur ...

随机推荐

  1. spring boot——MockMvc的用法 (SpringBoot 1.5.18)下测试通过

    spring boot——MockMvc的用法   1.pom配置 <dependency> <groupId>org.springframework.boot</gro ...

  2. ProtocBuffer安装

    学习protocolhttp://www.jianshu.com/p/fa126a8535a0 mac安装protocbuff: 下边总结一下安装流程: 查看官方文档源码在 https://githu ...

  3. Java反射详解(Spring配置)

    1. 反射原理 a).运行时通过 Class c = Class.forName("com.hua.xx.DynTest")加载类文件 b).通过 DynTest t = c.ne ...

  4. SpringBoot | 第十六章:web应用开发

    前言 前面讲了这么多直接,都没有涉及到前端web和后端交互的部分.因为作者所在公司是采用前后端分离方式进行web项目开发了.所以都是后端提供api接口,前端根据api文档或者服务自行调用的.后台也有读 ...

  5. SpringMVC05 return (Json)

    这里要主要的是js文件要引入,文中不做解释 1.导入包 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xs ...

  6. js中的位运算符 ,按位操作符

    按位操作符(Bitwise operators) 将其操作数(operands)当作32位的比特序列(由0和1组成),而不是十进制.十六进制或八进制数值.例如,十进制数9,用二进制表示则为1001.按 ...

  7. cms-友情链接实现静态化

    service: package com.open1111.service.impl; import java.util.List; import javax.servlet.ServletConte ...

  8. C,通信,多线程,数据库小练习——在线电子词典第一版

    #ifndef FILE_H #define FILE_H #include<stdio.h> #include<sys/types.h> #include<sys/so ...

  9. coursera_ML_1

    机器学习定义: A  computer program is said to leran from experience E with respect to some task T and some ...

  10. IOS类似9.png

    图形用户界面中的图形有两种实现方式,一种是用代码画出来,比如Quartz 2D技术,狠一点有OpenGL ES,另一种则是使用图片. 代码画的方式比较耗费程序员脑力,CPU或GPU; 图片则耗费磁盘空 ...