在只有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. 拦截QWebView弹出窗口

    环境 系统:win7 64位旗舰版 软件:VS2013.QT5.5.1-32位 概述 当网页打开一个新的窗口时,我们有时候需要根据URL地址来判断弹出窗口是否合理,如果合理则弹出新窗口,否则不弹出.本 ...

  2. 面向GC的Java编程(转)

    转自:http://blog.hesey.net/2014/05/gc-oriented-java-programming.html Java程序员在编码过程中通常不需要考虑内存问题,JVM经过高度优 ...

  3. module parameters

    Parameter values can be assigned at load time by insmod or modprobe(this can read parameter from con ...

  4. 获取生日对应星座的PHP函数

    PHP 获取指定日期对应的星座名称 /** * 获取指定日期对应星座 * * @param integer $month 月份 1-12 * @param integer $day 日期 1-31 * ...

  5. 真实代理(RealProxy)在WCF中的运用

    在WCF中,当我们在调用服务端的方法时,一般有两点需要考虑:1.捕获服务端的异常信息,记录日志:2.及时关闭会话信道,当调用超时或调用失败时及时中断会话信道.我们一般会像下面这样处理(以Calcula ...

  6. scroll、client和offset的区别

    scroll.client和offset的区别:http://www.cnblogs.com/pcd12321/p/4448420.html

  7. 《JS权威指南学习总结--9.3 JS中JAVA式的类继承》

    内容要点: 一.JS中的类 1.JAVA或其他类似强类型 面向对象语言的 类成员的模样 实例字段:它们是基于实例的属性或变量,用以保存独立对象的状态. 实例方法: 它们是类的所有实例所共享的方法,由每 ...

  8. HDU3791二叉搜索树(二叉树)

    Problem Description 判断两序列是否为同一二叉搜索树序列   Input 开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束.接下去一行是一 ...

  9. POJ 1042 Gone Fishing#贪心

    (- ̄▽ ̄)-* #include<iostream> #include<cstdio> #include<cstring> using namespace std ...

  10. sublime 3 最新 LICENSE

    http://blog.sina.com.cn/s/blog_68e267e10102v76h.html