1. 给出结论:

(1)不管有木有出现异常,finally块中代码都会执行
(2)当try和catch中有return时,finally仍然会执行
(3)finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的
(4)finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值

举例:

情况1:try{} catch(){}finally{} return;
          显然程序按顺序执行。

情况2:try{ return; }catch(){} finally{} return;
          程序执行try块中return之前(包括return语句中的表达式运算)代码;
          再执行finally块,最后执行try中return;
          finally块之后的语句return,因为程序在try中已经return所以不再执行。

情况3:try{ } catch(){return;} finally{} return;
          程序先执行try,如果遇到异常执行catch块,
          有异常:则执行catch中return之前(包括return语句中的表达式运算)代码,再执行finally语句中全部代码,
                     最后执行catch块中return. finally之后也就是4处的代码不再执行。
          无异常:执行完try再finally再return.

情况4:try{ return; }catch(){} finally{return;}
          程序执行try块中return之前(包括return语句中的表达式运算)代码;
          再执行finally块,因为finally块中有return所以提前退出。

情况5:try{} catch(){return;}finally{return;}
          程序执行catch块中return之前(包括return语句中的表达式运算)代码;
          再执行finally块,因为finally块中有return所以提前退出。

情况6:try{ return;}catch(){return;} finally{return;}
          程序执行try块中return之前(包括return语句中的表达式运算)代码;
          有异常:执行catch块中return之前(包括return语句中的表达式运算)代码;
                       则再执行finally块,因为finally块中有return所以提前退出。
          无异常:则再执行finally块,因为finally块中有return所以提前退出。

最终结论

 任何执行try 或者catch中的return语句之前,都会先执行finally语句,如果finally存在的话。如果finally中有return语句,那么程序就return了,所以finally中的return是一定会被return的,编译器把finally中的return实现为一个warning

2. 至少有两种情况下finally语句是不会被执行的:

(1)try语句没有被执行到,如在try语句之前return就返回了,这样finally语句就不会执行,这也说明了finally语句被执行的必要而非充分条件是:相应的try语句一定被执行到。

(2)在try块中有System.exit(0);这样的语句,System.exit(0);是终止Java虚拟机JVM的,连JVM都停止了,所有都结束了,当然finally语句也不会被执行到。

-->1.案例如下:

 package com.himi.finallydemo;

 public class FinallyDemo2 {

     public static void main(String[] args) {
System.out.println(getInt()); } public static int getInt() {
int a = 10;
try {
System.exit(0);
System.out.println(a / 0);
a = 20; } catch (ArithmeticException e) {
a = 30;
// return a;
} finally {
a = 40;
} return a;
} }

运行效果如下:

上面的getInt()方法中,先执行int a = 10;然后再执行try语句,发现开始就是System.exit(0),这样虚拟机jvm直接退出,当然也不会印出任何信息。

-->2. 案例如下:

 package com.himi.finallydemo;

 public class FinallyDemo2 {

     public static void main(String[] args) {
System.out.println(getInt()); } public static int getInt() {
int a = 10;
try {
System.out.println(a / 0);//执行完,直接跳转到第17行
System.exit(0);
a = 20; } catch (ArithmeticException e) {
a = 30;
// return a;
} finally {
a = 40;
} return a;
} }

运行如下效果:

这里在try语句中执行System.out.println(a / 0),系统会马上捕获到异常直接执行catch语句,然后执行finally语句,最后return a

(此时a是40)

-->3.案例:

 package com.himi.finallydemo;

 public class FinallyDemo2 {

     public static void main(String[] args) {
System.out.println(getInt()); } public static int getInt() {
int a = 10;
try {
System.out.println(a / 0);
System.exit(0);
a = 20; } catch (ArithmeticException e) {
a = 30;
return a;
/*
* return a在程序执行到这一步的时候,这里不是return a而是return 30;这个返回路径就形成了。
* 但是呢,它发现后面还有finally,所以继续执行fianlly的内容,a=40
* 再次回到以前的返回路径,继续走return 30;
*/
} finally {
a = 40;
//return 40;//如果这样结果就是40
} return a;
} }

运行效果如下:

Java基础知识强化之IO流笔记06:有return的情况下try catch finally的执行顺序的更多相关文章

  1. Java基础知识强化之IO流笔记17:FileOutputStream构造方法使用

    1. 可以参照之前写的笔记:   Android(java)学习笔记167:Java中操作文件的类介绍(File + IO流) 2. FileOutputStream(常用的)构造方法: FileOu ...

  2. Java基础知识强化之IO流笔记83:NIO与IO

    当学习了Java NIO和IO的API后,一个问题马上涌入脑海: 我应该何时使用IO,何时使用NIO呢?在本文中,我会尽量清晰地解析Java NIO和IO的差异.它们的使用场景,以及它们如何影响您的代 ...

  3. Java基础知识强化之IO流笔记71:NIO之 NIO的(New IO流)介绍

    1. I/O 简介 I/O ( 输入/输出  ):指的是计算机与外部世界或者一个程序与计算机的其余部分的之间的接口.它对于任何计算机系统都非常关键,因而所有 I/O 的主体实际上是内置在操作系统中的. ...

  4. Java基础知识强化之IO流笔记68:Properties和IO流集合使用

    1. Properties和IO流集合使用 这里的集合必须是Properties集合:  public void load(Reader reader):把文件中的数据读取到集合中  public v ...

  5. Java基础知识强化之IO流笔记66:Properties的概述 和 使用(作为Map集合使用)

    1. Properties的概述  Properties:属性集合类.是一个可以和IO流相结合使用的集合类. 该类主要用于读取以项目的配置文件(以.properties结尾的文件 和 xml文件). ...

  6. Java基础知识强化之IO流笔记41:字符流缓冲流之复制文本文件案例02(使用 [ newLine() / readLine() ] )(重要)

    1. 使用字符流缓冲流的特殊功能 [ newLine() / readLine() ] 需求:把当前项目目录下的a.txt内容复制到当前项目目录下的b.txt中  数据源: a.txt -- 读取数据 ...

  7. Java基础知识强化之IO流笔记39:字符流缓冲流之复制文本文件案例01

    1. 字符流缓冲流之复制文本文件案例 需求:把当前项目目录下的a.txt内容复制到当前项目目录下的b.txt中 数据源: a.txt -- 读取数据 -- 字符转换流 -- InputStreamRe ...

  8. Java基础知识强化之IO流笔记38:字符流缓冲流之BufferedWriter / BufferedReader使用

    1. 字符流缓冲流: 字符流为了高效读写,也提供了对应的字符缓冲流. BufferedWriter:字符缓冲输出流 BufferedReader:字符缓冲输入流 2. BufferedWriter使用 ...

  9. Java基础知识强化之IO流笔记37:FileReader/FileWriter(转换流的子类)复制文本文件案例

    1. 转换流的简化写法: 由于我们常见的操作都是使用本地默认编码,所以,不用指定编码.而转换流的名称有点长,所以,Java就提供了其子类供我们使用:FileReader / FileWriterOut ...

随机推荐

  1. Laravel PHP Web开发框架

    Laravel是一套简洁.优雅的PHP Web开发框架(PHP Web Framework).它可以让你从面条一样杂乱的代码中解脱出来:它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁.富于 ...

  2. Magento 2.0 安装

    环境: 直接升到最新版PHP5.6.x 刚才开MAC OS PHP 5.5  CENTOS PHP 5.5  composer install  依懒包错误.反复安装组件.还是不行.后来决定重新编释最 ...

  3. div浮动框居于浏览器窗口中间

    代码先贴这里,随后再改 <script language="JavaScript"> document.getElementById('divCenter').styl ...

  4. ios CAF音频转换为MP3

    Url:http://blog.csdn.net/ysy441088327/article/details/7392842#reply 为了达到 iPhone 与 Android 实现音频互通. 那么 ...

  5. PHP调试工具Xdebug安装配置教程

    说道PHP代码调试,对于有经验的PHPer,通过echo.print_r.var_dump函数,或PHP开发工具zend studio.editplus可解决大部分问题,但是对于PHP入门学习的童鞋来 ...

  6. BZOJ 1051 受欢迎的牛

    Description 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎,那么牛A也认 ...

  7. cf E. George and Cards

    http://codeforces.com/contest/387/problem/E 题意:给你n个数,然后在输入k个数,这k个数都在n个数中出现,进行每一次操作就是在n个数中选择长度为w的连续序列 ...

  8. BZOJ 1072 [SCOI2007]排列perm

    1072: [SCOI2007]排列perm Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1268  Solved: 782[Submit][Sta ...

  9. 查错 CH Round #57 - Story of the OI Class

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2357%20-%20Story%20of%20the%20OI%20Class/查错 题解:刚开始看见立马以为是 ...

  10. Qt入门(18)——使用信号和槽连接控件

    下面显示了如何使用信号和槽来创建自定义窗口部件,和如何使用更加复杂的方式把它们连接起来. 首先,源文件被我们分成几部分并放在放在t7目录下. t7/lcdrange.h包含LCDRange类定义.t7 ...