1. 最简单的情形

    public void main(){
String s = test();
System.out.println("s=[" + s + "]");
} public String test(){
String s = "";
try{
System.out.println("In try");
s += "try," ;
}catch(Exception ex){
System.out.println("In catch");
}finally{
s += "finally,";
System.out.println("In finally");
}
s+="other";
return s;
}

输出的结果是:

In try
In finally
s=[try,finally,other]

2. 在try中加上return,那么结果是

    public String test(){
String s = "";
try{
System.out.println("In try");
s += "try," ;
return s; //加上return
}catch(Exception ex){
System.out.println("In catch");
}finally{
s += "finally,";
System.out.println("In finally");
}
s+="other";
return s;
}

结果是

In try
In finally
s=[try,]

说明虽然会执行finally语句,但是return的结果已经准备好了。然后才执行finally,在执行finally之前,会将返回的结果存储到不同于s的变量中,finally执行成功之后,才会返回对应的结果。因此即使在finally中对结果进行修改,也不会修改返回的结果。

3. 如果在catch中return会怎么样呢?

    public String test(){
String s = "";
try{
System.out.println("In try");
s += "try," ;
throwException();
}catch(NullPointerException ex){
System.out.println("In catch");
s += "catch,";
return s;
}finally{
s += "finally,";
System.out.println("In finally");
}
s+="other";
return s;
} public void throwException() throws NullPointerException{
throw new NullPointerException();
}

执行结果是:

In try
In catch
In finally
s=[try,catch,]

可见道理是一样的,也就是不管在try还是在catch中的语句中return的结果,即使在finally中进行修改,都不会改变结果。

4. return 语句先执行,还是finally先执行呢?

    public String test(){
String s = "";
try{ System.out.println("In try");
s += "try," ;
throwException();
}catch(NullPointerException ex){
System.out.println("In catch");
s += "catch,";
return s += testReturn();
}finally{
s += "finally,";
System.out.println("In finally");
}
s+="other";
return s;
} public String testReturn(){
System.out.println("In Return");
return "return,";
} public void throwException() throws NullPointerException{
throw new NullPointerException();
}

结果是:

In try
In catch
In Return
In finally
s=[try,catch,return,]

也就是,return还是要比finally先执行,但是这时函数还没急着返回,只有把finally执行完才会返回。

总结的结果是:

1. 不管是否有异常,finally都会执行

2. 即使try或catch中有return语句,finally仍然会执行

3. finally中语句是在return语句之前执行的,即return语句执行就决定了返回的结果

4. return语句执行完如果还有finally块,还会执行finally块,但是无法修改return语句返回的结果

参考资料:

http://www.cnblogs.com/ybwang/archive/2010/10/10/1847269.html

Java中 return 和finally的更多相关文章

  1. 经典的java中return和finally问题!

    经典的java中return和finally问题! 标签: 杂谈 分类: java学习 前一段时间 参加公司的笔试问了这个问题,回来一查才知道当时自己做错了,百思不得其解,上网查到下面的程序,但是运行 ...

  2. Java中return的语句

    1.return语句的作用:a.返回一个值,这个值可以是任意类型.b.使程序返回到操作系统(即终止程序)2.java中对于一个函数,不论有没有返回值类型,都可以带有return 语句.但是区别在于,r ...

  3. java中return在Try-Catch中的执行顺序

    我们知道return会结束此方法并返回指定值.以及在Try-catch-finally中无论try代码块中有没有异常finally中的代码时都会被执行的.但是如果return包含在try-catch- ...

  4. java中return与finally的执行顺序

    可不能小看这个简单的 finally,看似简单的问题背后,却隐藏了无数的玄机.接下来我就带您一步一步的揭开这个 finally 的神秘面纱. 问题分析 首先来问大家一个问题:finally 语句块一定 ...

  5. Java中Return和Finally运行顺序的实现

    以下这段代码的运行结果是如何的呢? [java] view plaincopyprint? publc int test(){ int x; try{ ; return x; }catch(Excep ...

  6. Java中return返回结果的优先级

    在Java开发时,异常处理是非常普遍的.先看这样一道关于异常处理的代码 public static int getNumer() { int a = 1; try { return a; } catc ...

  7. Java中Return和Finally执行顺序的实现

    下面这段代码的执行结果是怎样的呢? publc int test(){ int x; try{ x = 1; return x; }catch(Exception e){ x = 2; return ...

  8. java 中 return 的两种常见的用法

    一:return语句总是用在方法中,有两个作用: 一个是返回方法指定类型的值(这个值总是确定的), 一个是结束方法的执行(仅仅一个return语句). 二:实例1 -- 返回一个String priv ...

  9. java中return和continue区别

    编程语言大多是想通的,当然java也不例外,下面的在其他编程语言也是相同的道理. return与continue的区别 先看代码哦 class demo2 { public static void m ...

随机推荐

  1. SVM应用

    我在项目中应用的SVM库是国立台湾大学林智仁教授开发的一套开源软件,主要有LIBSVM与LIBLINEAR两个,LIBSVM是对非线性数据进行分类,大家也比较熟悉,LIBLINEAR是对线性数据进行分 ...

  2. 进程通信之一 使用WM_COPYDATA C++及C#实现(转)

    进程间通信最简单的方式就是发送WM_COPYDATA消息.本文提供C++及C#程序相互通信的二种实现方式.这样消息的接收端可以用C++实现,发送端可以用C++或C#实现.     发送WM_COPYD ...

  3. uva202:循环小数(循环节+抽屉原理)

    题意: 给出两个数n,m,0<=n,m<=3000,输出n/m的循环小数表示以及循环节长度. 思路: 设立一个r[]数组记录循环小数,u[]记录每次的count,用于标记,小数计算可用 r ...

  4. Linux之一次性安装开发工具:yum groupinstall Development tools

    [spark@sparksinglenode ~]$ yum grouplist | moreLoaded plugins: fastestmirror, refresh-packagekit, se ...

  5. DelphiXE7操作sqlite数据库

    准备工作: 1.用SQLiteExpertPers建立一个sqlite数据库. 2.打开delphi xe7. 一.FireDAC法 设置库联接 1.放入FDConnection1控件 2.放入FDC ...

  6. VIM技巧(2)-删除匹配行

    VIM技巧(2)-删除匹配行 代码如下: * @Company:中国股份有限公司 * @author ymzhao (也有zyyang的) * @Date: Jan 22, 2014 11:25:29 ...

  7. C++库研究笔记——操作符重载实现类型转换&这样做的意义

    目标: 已知这个接口: std::vector<double> add_vec(double *d1, double *d2) { ..... return result; } 我们自定义 ...

  8. DbHelper数据操作类

    摘要:本文介绍一下DbHelper数据操作类 微软的企业库中有一个非常不错的数据操作类.但是,不少公司(起码我遇到的几个...),对一些"封装"了些什么的东西不太敢用,虽然我推荐过 ...

  9. 【SQL】SQL2012 导入导出报错,未在计算机上注册...

    导出时报错: 如图: 解决方法:下载插件: 下载地址:http://download.microsoft.com/download/7/0/3/703ffbcb-dc0c-4e19-b0da-1463 ...

  10. MEF 编程指南(二):定义可组合部件和契约

    可组合部件(Composable Parts)   在 MEF 内部可组合部件是一个可组合单元.可组合部件导出其他可组合部件需要的服务,并且从其他可组合部件导入服务.在 MEF 编程模型中,可组合部件 ...