在只有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. android从assets读取文件的方法

    因为开发需要,经常要从工程的assets文件夹里面读取文件,现在贴一个方法以作记录: private void getFromAssets(String fileName, ArrayList< ...

  2. pre标签

    $(" .pop-info").html("<PRE>"+data.info+"<PRE>"): 数据库里的换行存的 ...

  3. C# WebBrowser禁止F5刷新

    在用写一个桌面软件的过程中,用到webbrowser实现界面.这时有一个禁止webbrowser通过f5按键进行刷新的要求.本着边做边学的原则,本菜查了一下百度,原来这么简单,代码如下: this.w ...

  4. Jquery 返回顶部

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  5. JSON及与XML比较

      JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于JavaScript(Standard ECMA-262 3rd Edition - Decem ...

  6. ActionBar之style出现Cannot resolve symbol 'Theme' 错误

    今天 2014/03/08 00:49 刚刚升级 android studio 到了 0.5.0 版本,修复了许多 bug,包含当前这个问题,之前一直困扰我很久,莫名奇妙的提示主题样式找不到,无法解析 ...

  7. 老司机的奇怪noip模拟T2-huangyueying

    2. 黄月英(huangyueying.cpp/c/pas )[问题描述]xpp 每天研究天文学研究哲学,对于人生又有一些我们完全无法理解的思考.在某天无聊学术之后, xpp 打开了 http://w ...

  8. express学习点滴- session()和cookieSession()的区别

    express 里提供了两种有关session的中间件 * session() 提供了内存和数据库两种方式保存session.具体两种session原理请自行学习,不进行展开了.自己也是一知半解... ...

  9. php 关联数组

    <?php header("content-type:text/html;charset=utf8");$fruit = array(    'apple'=>&quo ...

  10. 用block解决nstimer循环引用

    大多数开发者可能都会这样来实现定时器.创建定时器的时候,由于目标对象是self,所以要保留此实例.然而,因为定时器是用实例变量存放的,所以实例也保留了定时器,这就造成了循环引用.除非调用stop方法, ...