在只有try-catch语句中,如果catch块中出现了return语句或者抛出了异常,那么catch之后的语句是执行不到的;但是如果将代码放入finally中,即使catch中出现了return语句或者抛出了异常,finally中的代码仍然是可以执行到的。看下面的程序:

public class Test {

	public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(test());
} public static int test() {
int b = 23;
try {
System.out.println("yes");
return b += 88;
} catch (Exception e) {
System.out.println("error:" + e);
}
System.out.println("next");
return b;
}
}

  因为try块中没有出现异常,且有return语句,所以后面的输出程序没有执行。但如果把输出程序放到finally中,则会执行到。

		try {
System.out.println("yes");
return b += 88;
} catch (Exception e) {
System.out.println("error:" + e);
}finally{
System.out.println("finally");
}

  看第一段程序,最后有一个return b语句。如果缺少这条语句,程序会报错,提示test()方法必须返回一个int类型的值。可能有人会发现try语句中已经有了一个return语句了,为何还会报错呢。这是因为try块中放入的是可能出现异常的代码,如果发生了异常,系统就不会再执行try块中未执行的代码。所以存在一种情况就是程序还没执行到return语句时,就因为异常去执行catch中语句。这样的话,程序就跳过了return语句,所以必须在后面加上一个return。

  另外,如果我们把return语句放到finally块中,会有“finally does not complete normally”警告出现。原因可能如下:

1、不管try块、catch块中是否有return语句,finally块都会执行。
2、finally块中的return语句会覆盖前面的return语句(try块、catch块中的return语句),所以如果finally块中有return语句,Eclipse编译器会报警告“finally block does not complete normally”。

3、如果finally块中包含了return语句,即使前面的catch块重新抛出了异常,则调用该方法的语句也不会获得catch块重新抛出的异常,而是会得到finally块的返回值,并且不会捕获异常。

  下面来看finally和return的问题。如果我们在第一段程序中的finally中添加一些代码,如下所示:

package com.imooc1;

public class Test {

	public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(test());
} public static int test() {
int b = 23;
try {
System.out.println("yes");
return b += 88;
} catch (Exception e) {
System.out.println("error:" + e);
} finally {
if (b > 25) {
System.out.println("b>25:" + b);
}
System.out.println("finally");
}
return b;
}
}

  程序的运行结果会如何呢?这个主要是用来测试return和finally语句到底哪个先执行。在try语句中,返回了b=111; 在finally语句中判断是否大于25,如果大的话就输出大.最终结果如下:

yes
b>25:111
finally
111

  这说明finally语句是在try的return语句执行之后,return返回之前执行的

  如果把finally语句改成这样(会有上面所说的警告出现):

package com.imooc1;

public class Test {

	public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(test());
} public static int test() {
int b = 23;
try {
System.out.println("yes");
return b += 88;
} catch (Exception e) {
System.out.println("error:" + e);
} finally {
if (b > 25) {
System.out.println("b>25:" + b);
}
System.out.println("finally");
return 100;
}
// return b;
}
}

  结果变为了:

yes
b>25:111
finally
100

  这说明finally块中的return语句会把try块中的return覆盖!

  如果把finally中语句变成这样:

package com.imooc1;

public class Test {

	public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(test());
} public static int test() {
int b = 23;
try {
System.out.println("yes");
return b += 88;
} catch (Exception e) {
System.out.println("error:" + e);
} finally {
if (b > 25) {
System.out.println("b>25:" + b);
}
System.out.println("finally");
b=100;
}
return b;
}
}

   也就是在finally中改变b的值. 那么返回结果到底是原来的b值呢, 还是更改过的b值呢?结果如下:

yes
b>25:111
finally
111

  说明了一个问题,如果finally语句中没有返回语句覆盖的话,那么原来的返回值就不会变,不管你是不是改变了要返回的那个变量。但如果程序因为出现了异常而没有执行try中的return,则这样的改变是有效的。测试代码如下:

package com.imooc1;

public class Test {

	public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(test());
} public static int test() {
int b = 23;
int a = 0;
try {
System.out.println("b/a"+b/a);
return b += 88;
} catch (ArithmeticException e) {
e.printStackTrace();
} finally {
if (b > 25) {
System.out.println("b>25:" + b);
}
System.out.println("finally");
b=100;
}
return b;
}
}

  程序运行结果如下:

java.lang.ArithmeticException: / by zero
at com.imooc1.Test.test(Test.java:14)
at com.imooc1.Test.main(Test.java:7)
finally
100

Java中try-catch-finally的一点理解的更多相关文章

  1. 【转】Java中try catch finally语句中含有return语句的执行情况(总结版)

    Java中try catch finally语句中含有return语句的执行情况(总结版) 有一点可以肯定,finally块中的内容会先于try中的return语句执行,如果finall语句块中也有r ...

  2. 关于Java中语句符号及格式的理解

    关于Java中语句符号及格式的理解 这篇文章是撰写的第一篇文章,在此作一下博主是一名在读的工科研究生,种种原因,研二开始决定转行从事程序员工作.开始的自学之路并不算非常顺畅,也走了一点弯路,但一直都坚 ...

  3. Java中try,catch,finally的用法

    Java中try,catch,finally的用法,以前感觉还算熟悉,但看到一篇博文才有更深点的理解,总结网友博客如下. Java异常处理的组合方式: 1.try+catch  运行流程:运行到try ...

  4. Java中关于static语句块的理解

    Java中关于static语句块的理解 一.static块会在类被加载的时候执行且仅会被执行一次,一般用来初始化静态变量和调用静态方法. 实例一 public class A{ String name ...

  5. Java中常用的设计模式代码与理解

    Java中常用的设计模式代码与理解 一.单例模式 1.饿汉式 (太饿了,类加载的时候就创建实例) /** * 饿汉式单例模式 */ public class HungrySingleInstance ...

  6. Java中关于WeakReference和WeakHashMap的理解

    新美大的10月11日的笔试中有一道选择题,让选择函数返回结果,代码如下: private static String test(){ String a = new String("a&quo ...

  7. 【转】Java中关于WeakReference和WeakHashMap的理解

    新美大的10月11日的笔试中有一道选择题,让选择函数返回结果,代码如下: private static String test(){ String a = new String("a&quo ...

  8. java中 try catch finally和return联合使用时,代码执行顺序的小细节

    代码1测试 public static void main(String[] args) { aa(); } static int aa() { try { int a=4/0; } catch (E ...

  9. java中try{}catch{}和finally{}的执行顺序问题

     今天我给大家讲解一下java的的错误和异常处理机制以及相关异常的执行顺序问题.如有不足的地方,欢迎批评指正~ 1.首相简单介绍一下java中的错误(Error)和异常(Exception) 错误和异 ...

  10. java中的异常和处理详细理解

    异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的. 比如说,你的代码少了一个分号,那么运行出来结果是提示是错误 java.lang.Error:如果你用System.ou ...

随机推荐

  1. easyUI的treegrid列表添加查询

    一些数据使用treegrid显示,添加筛选条件, 首先创建treegrid列表 var tree = $("#TreeGrid").treegrid({ url:"cha ...

  2. Sub Lime Text

    Sub Lime Text License -– BEGIN LICENSE -– Andrew Weber Single User License EA7E-855605 813A03DD 5E4A ...

  3. openstack添加数据库

    输入:neutron-db-manage revision -m "表的名称"        neutron-db-manage upgrade head 如果遇到版本名找不到的情 ...

  4. SNS

    SNS,专指社交网络服务.也指社交现有已成熟普及的信息载体,如短信SMS服务.SNS的另一种常用解释:全称Social Network Site,即“社交网站”或“社交网”.SNS也指Social N ...

  5. 淘淘商城_day06_课堂笔记

    今日大纲 实现单点登录系统 基于单点登录系统实现,用户的注册和登录 商品数据同步问题 问题 后台系统中将商品修改,前台系统没有进行数据的同步,导致前端系统不能够实时显示最新的数据. 解决 后台系统中商 ...

  6. BOS物流管理系统-第一天

    BOS物流管理系统-第一天-系统分析.环境搭建.前端框架 BoBo老师 整体项目内容目标: 对项目概述的一些理解 亮点技术的学习 注意学习方式:优先完成当天代码. 其他内容. 最终: 学到新的技术,会 ...

  7. PAT 团体程序设计天梯赛-练习集 L1-017. 到底有多二

    一个整数“犯二的程度”定义为该数字中包含2的个数与其位数的比值.如果这个数是负数,则程度增加0.5倍:如果还是个偶数,则再增加1倍.例如数字“-13142223336”是个11位数,其中有3个2,并且 ...

  8. JS复习:第二十二章

    一.高级函数 1.在任何值上调用Object原声的toString( )方法,都会返回一个[object NativeConstructorName]格式d字符串.每个类在内部都有一个[[Class] ...

  9. Linux入门(四)linux运行环境mysql详细操作及安装phpmyadmin

    1.1 安装mysql(中间需要设定数据库的密码) sudo apt-get install mysql-serversudo apt-get install php5-mysql   #安装php5 ...

  10. jquery 画板折叠

    <!doctype html><html lang="en"><head> <meta charset="utf-8" ...