黑马程序员技术交流社区

标题: 一个抛异常中返回值的疑惑 [打印本页]

作者: 沈子豪    时间: 2013-3-18 20:50
标题: 一个抛异常中返回值的疑惑
package test;

public class Test {
public static void main(String[] args) {
        System.out.println(getNumber());
}
public static int getNumber()
{
        //定义成员变量
        int x=10;
        //抛异常
        try{
                System.out.println(10/0);
                        }
        catch(Exception e)
        {
                x=20;
                return x;
        }
        finally
        {
        x=30;
        System.out.println("hello");
        }
        return 0;
}
}
//输出的结果是hello 20,为什么是20?具体的运行过程是怎么样的?求解

作者: 丁一    时间: 2013-3-18 20:54
经过测试
1、执行 try   必须的,顺序执行
2、catch    顺序执行  但不返回值 应该是将返回值保存内存中
3、执行finally  必须执行语句
4、这个时候执行return 语句  

注意 finally 不能改变 return 的数据
作者: 杨博    时间: 2013-3-18 20:56
try{}catch(){}finally{}运行中,如果catch(Exception e){x=20;return x;}方法,在finally前执行了return,finally会先被执行,所有会输出hello 20,但有一种情况
不会被执行,就是System.exit(0);这种情况相当于直接关闭虚拟机了
作者: 贾文泽    时间: 2013-3-18 21:02
丁一 发表于 2013-3-18 20:54
经过测试
1、执行 try   必须的,顺序执行
2、catch    顺序执行  但不返回值 应该是将返回值保存内存中

何以见得?如果finally中也有个return呢?是不是能改变最后的返回值????
作者: 丁一    时间: 2013-3-18 21:06
贾文泽 发表于 2013-3-18 21:02
何以见得?如果finally中也有个return呢?是不是能改变最后的返回值???? ...

如果return 返回就不返回上面的值了
作者: 贾文泽    时间: 2013-3-18 21:13
丁一 发表于 2013-3-18 21:06
如果return 返回就不返回上面的值了

如果try中有return语句,程序是吧要return的值暂时缓存起来,等待finally执行完毕之后再返回,
但是,如果finally中要是也有return语句,就会覆盖原来缓存的值,运行结束后就返回的事finally中返回的值
作者: 丁一    时间: 2013-3-18 21:31
贾文泽 发表于 2013-3-18 21:13
如果try中有return语句,程序是吧要return的值暂时缓存起来,等待finally执行完毕之后再返回,
但是,如 ...

是覆盖的还是直接返回的没办法确定吧,有没有东西能直接查看内存,看那个时间段内存中有两个对象还是一个对象
作者: 贾文泽    时间: 2013-3-18 22:15
丁一 发表于 2013-3-18 21:31
是覆盖的还是直接返回的没办法确定吧,有没有东西能直接查看内存,看那个时间段内存中有两个对象还是一个 ...

忘了什么时候在哪本书上看过是覆盖。。。。
作者: 丁一    时间: 2013-3-24 14:22
贾文泽 发表于 2013-3-18 22:15
忘了什么时候在哪本书上看过是覆盖。。。。

是覆盖!

《Java核心技术》卷1,是这样说的:当finally字句包含return语句时,将会出现一些意想不到的结果。假设利用return语句从try语句块中退出,在方法返回前,finally子句的内容将被执行。如果finally子句中也有一个return语句,这个返回值将会覆盖原始的返回值。p480




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2