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. codeforce 702D Road to Post Office 物理计算路程题

    http://codeforces.com/contest/702 题意:人到邮局去,距离d,汽车在出故障前能跑k,汽车1公里耗时a,人每公里耗时b,修理汽车时间t,问到达终点最短时间 思路:计算车和 ...

  2. CentOS搭建LAMP环境

    最近准备安装roundcube,需要先搭建一个 LAMP 运行环境,从网上搜索了一下,有不少资料.自己也按部就班安装了一遍,把过程整理了下来. LAMP 是Linux, Apache, MySQL, ...

  3. leetcode—sqrt

    1.题目描述   Implement int sqrt(int x).   Compute and return the square root of x. 2.解法分析 很明显,用二分搜索可解,但是 ...

  4. 通用表表达式(Common Table Expression)

    问题:编写由基本的 SELECT/FROM/WHERE 类型的语句派生而来的复杂 SQL 语句. 方案1:编写在From子句内使用派生表(内联视图)的T-SQL查询语句. 方案2:使用视图 方案3:使 ...

  5. 5个让人激动的Java项目

    每个Java/JVM领域的技术专家都应从那些项目中获益,他们中有2011在SanJose举办的Jax 会议中提名为最好的技术产品奖的.我之所以选择它们,是因为它们可以广泛用于一系列的项目中,解决真实问 ...

  6. sql server 2014内存表

    内存数据库,指的是将数据库的数据放在内存中直接操作.相对于存放在磁盘上,内存的数据读写速度要高出很多,故可以提高应用的性能.微软的SQL Server 2014已于2014年4月1日正式发布,SQL ...

  7. POJ 3041 Asteroids (二分图最小点覆盖)

    题目链接:http://poj.org/problem?id=3041 在一个n*n的地图中,有m和障碍物,你每一次可以消除一行或者一列的障碍物,问你最少消除几次可以将障碍物全部清除. 用二分图将行( ...

  8. ajax。表单

    JQuery读书笔记--JQuery-Form中的ajaxForm和ajaxSubmit的区别JQuery中的ajaxForm和ajaxSubmit使用差不多功能也差不多.很容易误解. 按照作者的解释 ...

  9. 剑指OFFER之数值的整数次方(九度OJ1514)

    题目描述: 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 输入: 输入可能包含多个测试样例.对于每个输入文件,第一行输入一个整数T,表 ...

  10. Linux学习笔记----(2)

    闲着无事,就敲起了Linux 命令,熟悉一下.记得昨天在书上看到了 find命令的用法,觉得挺神奇的. 其中 find 能够确定文件的查找深度 于是 敲了如下命令: #mkdir father #to ...