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. stl+模拟 CCF2016 4 路径解析

    // stl+模拟 CCF2016 4 路径解析 // 一开始题意理解错了.... #include <iostream> #include <string> #include ...

  2. mahout 安装

    1. 下载mahout-distribution-0.5.tar.gz 并解压: 2.配置环境变量: /etc/profile export MAHOUT_HOME=/home/mahout/ exp ...

  3. Spark系列(七)Master中的资源调度

    资源调度 说明: Application的调度算法有两种,分别为spreadOutApps和非spreadOutApps spreadOutApps 在spark-submit脚本中,可以指定要多少个 ...

  4. lsof,nc

    安装nc, yum -y install nc; 用nc传输同步文件 A,被同步端-即需要备份复制端; tar -czvf - /|nc 192.168.1.204(同步机ip,复制文件位置机) 88 ...

  5. java tools: jstat

    JavaScript is not supported by your browser. JavaScript support is required for full functionality o ...

  6. ERP存储过程

    [dbo].[st_MES_MonitorMachine] -------------------------------------------- USE [ChiefMESNew]GO /**** ...

  7. 用6个字符写出任意的Javascript代码

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:用6个字符写出任意的Javascript代码.

  8. Castle ActiveRecord学习实践

    Castle是针对.NET平台的一个开源项目,从数据访问框架ORM到IOC容器,再到WEB层的MVC框架.AOP,基本包括了整个开发过程中的所有东西,为我们快速的构建企业级的应用程序提供了很好的服务. ...

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

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

  10. cocos2d-x 让精灵按照自己设定的运动轨迹行动

    转自:http://blog.csdn.net/ufolr/article/details/7447773 在cocos2d中,系统提供了CCMove.CCJump.CCBezier(贝塞尔曲线)等让 ...