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. MFC使用ShowWindow(SW_MAXIMIZE)任务栏消失的处理

    ShowWindow(SW_SHOWMAXIMIZED);//窗口最大化 问题:在写程序时,如果包含了标题栏,但是没有包含最大化按钮或者最小话按钮. 那么人工用ShowWindow(SW_MAXIMI ...

  2. 坚持自学的第二天,bootstrap初入门

    前言 昨天,初步学完了jekyll目录结构与Liquid语法的应用与认识. 日志 今天刚入门,做了一个bootstrap导航栏,但是选中状态不行,找了JS中写好的API,写法与视频中讲的有点不一样,但 ...

  3. CSS布局基础

    (初级)css布局 一.单列布局1.基础知识块级元素 div p ul li dl dt 行级元素 img span input strong同一行显示.无换行2.盒子模型盒子模型 (边框border ...

  4. Nginx的配置文件(nginx.conf)解析和领读官网

    步骤一:vi nginx.conf配置文件,参考本博文的最下面总结,自行去设置 最后nginx.conf内容为 步骤二:每次修改了nginx.conf配置文件后,都要reload下. index.ht ...

  5. struts2+Hibernate4+spring3+EasyUI环境搭建之四:引入hibernate4以及spring3与hibernate4整合

    1.导入hibernate4 jar包:注意之前引入的struts2需要排除javassist  否则冲突 <!-- hibernate4 --> <dependency> & ...

  6. boost::bind 和 boost::function 基本用法

    这是一篇介绍bind和function用法的文章,起因是近来读陈硕的文章,提到用bind和function替代继承,于是就熟悉了下bind和function的用法,都是一些网上都有的知识,记录一下,期 ...

  7. [iOS基础控件 - 6.10] Notification 通知机制

    A.定义      iOS程序都有一个NSNotificationCenter的单例对象,用来负责发布不同对象之间的通知      任何对象都能够在NSNotificationCenter发布通知,发 ...

  8. linux系统中如何查看日志 (常用命令)

    cat tail -f 日 志 文 件 说 明 /var/log/message 系统启动后的信息和错误日志,是Red Hat Linux中最常用的日志之一 /var/log/secure 与安全相关 ...

  9. C++常用容器

    vector 顺序容器,和数组类似,可从尾部快速的插入和删除,可随机访问. vector的常用成员函数: #include<vector> std::vector<type> ...

  10. Android子线程更新UI的方法总结

    版权声明:本文为博主原创文章,转载请注明出处:https://i.cnblogs.com/EditPosts.aspx?postid=6121280 消息机制,对于Android开发者来说,应该是非常 ...