在只有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. Oracle SQL 关键字

    1.UID返回标识当前用户的唯一整数SQL> show userUSER 为"GAO"SQL> select username,user_id from dba_use ...

  2. QT枚举类型与字符串类型相互转换

    在QT中将枚举类型注册(QT_Q_ENUM或QT_Q_FLAG)后,就可以利用QT的元对象进行枚举类型与字符串类型转换了. 代码示例: #include <QtCore/QMetaEnum> ...

  3. Unity5权威讲解

    Photon Cloud 299c7416-a08d-4a23-95a1-e4be108259aa Shooter 视频:https://pan.baidu.com/s/1kVFJ1x9 项目:htt ...

  4. win10锁屏壁纸路径

    C:\Users\ShanYu\AppData\Local\Packages\Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy\LocalS ...

  5. Date时间对象方法

  6. prototype原型解析

    每个对象都有原型, prototype能够实现实例共享,节约使您有能力向对象添加属性和方法. 如 <script type="text/javascript"> fun ...

  7. c#委托与事件(详解)

    引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...

  8. cocos2d-lua ARPG手机游戏《烈焰遮天》(客户端+服务端+数据库)发布说明

    服务器发布流程及其规范1,环境准备        a, mvn命令行:从\\10.21.210.161\share\tools\apache-maven-3.1.1-bin.tar.gz取出安装包,  ...

  9. Intent的几种Flag的不同

    冬天有点冷,不想写博客. 研究下Intent的几种Flag的不同: 1,FLAG_ACTIVITY_CLEAR_TOP:会清理掉目标activity栈上面所有的activity Intent inte ...

  10. Stack Overflow for web end

    Jquery UI tooltip on disabled button In general, disabled elements do not trigger any DOM events. Th ...