Java的finally语句在try或catch中的return语句执行之后还是之前?
import java.util.HashMap;
import java.util.Map; public class FinallyDemo1 { public static void main(String[] args) {
System.out.println("=================================");
System.out.println("A情况:finally在try的return执行之后,返回之前。");
System.out.println("main\ti="+test1());
System.out.println("=================================");
System.out.println("B情况:finally在try的return执行之后,返回之前。finally的return将覆盖try的return:");
System.out.println("main\ti="+test2());
System.out.println("=================================");
System.out.println("异常时候,try的return不执行。catch和finally的执行情况与try和finally的执行情况一样。如A情况:");
System.out.println("main\ti="+test3());
System.out.println("=================================");
System.out.println("异常时候,try的return不执行。catch和finally的执行情况与try和finally的执行情况一样。如B情况:");
System.out.println("main\ti="+test4());
System.out.println("=================================");
System.out.println("地址传递的参数,在try-finally中将覆盖返回值。");
System.out.println("main\tmap="+test5());
System.out.println("=================================");
System.out.println("地址传递的参数,在try-finally中将覆盖返回值。");
System.out.println("main\tmap="+test6());
System.out.println("=================================");
} /**
* finally代码块是在try代码块中的return语句执行之后,返回之前执行的。
* @return
*/
public static int test1(){
int i=1;
try {
return i+=100;
} catch (Exception e) {
System.out.println("catch");
}finally{
i++;
System.out.println("finally\ti="+i); }
return i;
} /**
* finally代码块中的return语句覆盖try代码块中的return语句
* @return
*/
@SuppressWarnings("finally")
public static int test2(){
int i=1;
try {
return i+=100;
} catch (Exception e) {
System.out.println("catch");
}finally{
i++;
System.out.println("finally\ti="+i);
return i;
}
} /**
* try代码块中的return语句在异常的情况下不会被执行;
* catch中的return执行情况与未发生异常时try中return的执行情况完全一样。
* @return
*/
@SuppressWarnings("finally")
public static int test3(){
int i=1;
try {
i=i/0;
return i+=100;
} catch (Exception e) {
System.out.println("catch");
return i+=100;
}finally{
i++;
System.out.println("finally\ti="+i);
}
} @SuppressWarnings("finally")
public static int test4(){
int i=1;
try {
i=i/0;
return i+=100;
} catch (Exception e) {
System.out.println("catch");
return i+=100;
}finally{
i++;
System.out.println("finally\ti="+i);
return i;
} } /**
* 值传递:返回值不变
* 地址传递:返回值会变
* @return
*/
public static Map test5(){
Map<String, String> map = new HashMap<String, String>();
map.put("param1", "初始化值");
try {
System.out.println("try");
map.put("param1", "try值");
return map;
} catch (Exception e) {
System.out.println("catch");
map.put("param1", "catch值");
} finally {
System.out.println("finally");
map.put("param1", "finally值");
map = null;
}
return map;
} @SuppressWarnings("finally")
public static Map test6(){
Map<String, String> map = new HashMap<String, String>();
map.put("param1", "初始化值");
try {
System.out.println("try");
map.put("param1", "try值");
return map;
} catch (Exception e) {
System.out.println("catch");
map.put("param1", "catch值");
} finally {
System.out.println("finally");
map.put("param1", "finally值");
map = null;
return map;
} } }
控制台:
=================================
A情况:finally在try的return执行之后,返回之前。
finally i=102
main i=101
=================================
B情况:finally在try的return执行之后,返回之前。finally的return将覆盖try的return:
finally i=102
main i=102
=================================
异常时候,try的return不执行。catch和finally的执行情况与try和finally的执行情况一样。如A情况:
catch
finally i=102
main i=101
=================================
异常时候,try的return不执行。catch和finally的执行情况与try和finally的执行情况一样。如B情况:
catch
finally i=102
main i=102
=================================
地址传递的参数,在try-finally中将覆盖返回值。
try
finally
main map={param1=finally值}
=================================
地址传递的参数,在try-finally中将覆盖返回值。
try
finally
main map=null
=================================
Java的finally语句在try或catch中的return语句执行之后还是之前?的更多相关文章
- Java异常处理中finally中的return会覆盖catch语句中的return语句
Java异常处理中finally中的return会覆盖catch语句中的return语句和throw语句,所以Java不建议在finally中使用return语句 此外 finally中的throw语 ...
- Java中try catch finally语句中含return语句的执行情况总结-编程陷阱
前言:有java编程基础的人对java的异常处理机制都会有一定了解,而且可能感觉使用起来也比较简单,但如果在try catch finally语句块中遇到return语句,开发者可能就会遇到一些逻辑问 ...
- 【转】Java中try catch finally语句中含有return语句的执行情况(总结版)
Java中try catch finally语句中含有return语句的执行情况(总结版) 有一点可以肯定,finally块中的内容会先于try中的return语句执行,如果finall语句块中也有r ...
- Java中try catch finally语句中含有return语句的执行情况(总结版)
在这里看到了try >但有一点是可以肯定的,finally块中的内容会先于try中的return语句执行,如果finall语句块中也有return语句的话,那么直接从finally中返回了,这也 ...
- Java中try catch finally语句中含有return语句的执行情况
finally块中的内容会先于try中的return语句执行,如果finall语句块中也有return语句的话,那么直接从finally中返回了,这也是不建议在finally中return的原因.下面 ...
- java finally中含return语句
<java核心技术卷一>中提到过:当finally子句包含return 语句时(当然在设计原则上是不允许在finally块中抛出异常或者 执行return语句的,我不明白为何java的设计 ...
- Java中的return语句使用总结
Java中的return语句总是和方法有密切关系,return语句总是用在方法中,有两个作用,一个是返回方法指定类型的值(这个值总是确定的),一个是结束方法的执行(仅仅一个return语句). 在 ...
- java中try-catch-finally中的return语句
在try-catch-finally语句中使用return语句遇到了一些疑问 代码一: static int intc(){ int x =0; try{ x=1; return x; }finall ...
- try catch finally语句块中存在return语句时的执行情况剖析
2种场景 (1) try中有return,finally中没有return(注意会改变返回值的情形);(2) try中有return,finally中有return; 场景代码分析(idea亲测) 场 ...
随机推荐
- type和isinstance区别
type只能对类型做直接的判断,主要用于获取未知变量的类型. 在程序中几乎很少用到type. 而isinstance功能比type更强,可以对子类型做出推理判断. isinstance主要用于判断A是 ...
- oracle插入中文乱码
执行sql: select userenv('language') from dual; -- AMERICAN_AMERICA.ZHS16GBK select * from v$nls ...
- 响应式布局(CSS3弹性盒flex布局模型)
传统的布局方式都是基于盒模型的 利用display.position.float来布局有一定局限性 比如说实现自适应垂直居中 随着响应式布局的流行,CSS3引入了更加灵活的弹性布局模型 flex弹性布 ...
- Python3简明教程(十四)—— Collections模块
collections 是 Python 内建的一个集合模块,提供了许多有用的集合类. 在这个实验我们会学习 Collections 模块.这个模块实现了一些很好的数据结构,它们能帮助你解决各种实际问 ...
- JS怎么创建一个类?
15. JS怎么创建一个类? 方式1 : var obj = new Object(); 方式2 : var obj = {}; 16.JS的typeof返回哪些数据类型? string.number ...
- windows10用WMware安装Linux虚拟机详细步骤
windows10用WMware安装Linux虚拟机详细步骤 一.安装环境 windows10操作系统物理机VMware Workstation 软件(可以在网上下载)CentOS6.9镜像文件( ...
- django踩坑
django输入localhost或者127.0.0.1可以进入,输入自己ip报错 结局方案: 首先找到自己的项目的setting.py文件 找到——> ALLOWED_HOSTS = [] 修 ...
- Http请求封装(对HttpClient类的进一步封装,使之调用更方便。另外,此类管理唯一的HttpClient对象,支持线程池调用,效率更高)
package com.ad.ssp.engine.common; import java.io.IOException; import java.util.ArrayList; import jav ...
- 6. 将单独表空间(File-Per-Table Tablespaces)复制到另一个实例
6. 将单独表空间复制到另一个实例 本节介绍如何将单独表空间从一个MySQL实例复制 到另一个MySQL实例,也称为可传输表空间功能. 将InnoDB单独表空间复制到其他实例的原因有很多: - 在不对 ...
- webpack 之 plugin
loader和plugins的区别是:前者处理单个文件,而后者作用于整个打包过程 内置插件:BannerPlugin 可以在打包后的文件上方添加备注信息,如版权说明等 // webpack.confi ...