try-catch-finally 寻求解答

SealedBook 2009-10-31 09:10:25
废话不说,大家直接来看源代码

public class Test_4 {

public static void main(String[] args) {
System.out.println(test());

}
public static int test() {
int j = 0;
try {
j = 1;
System.out.println("try:" + j);
return j;
}catch (Exception e) {
// TODO: handle exception
}finally {
j = 2;
System.out.println("finally:" + j);
}
return j;
}

}

这里输出什么?我有一点不明白,finally里把j的值改变了,为什么返回的确是1?
在这里,小弟谢谢各位!
...全文
155 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
SealedBook 2009-11-05
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 aa8945163 的回复:]
具体的我在说一下,这里的代码运行的是先执行到try{}里面的语句,在try里面执行到return的时候,这时系统会返回,然而虚拟机不会这样执行他会判断一下有没有finally语句,然而要执行fnally语句的时候。他会保存return的现场,会用一个变量保存,但是在eclipse里面和在dos下执行的话,这个保存现场的变量声明的不一样,一个事char定义的变量保存,一个是byte类型的变量生成。
下面如果在finally里面执行在到这个修改返回变量的时候,就会又生成该变量的现场,但是不会保存,
执行完finally以后,在返回try里面的语句,这是由执行保存的现场,,所以返回的就是那个变量1啦。
[/Quote]
非常感谢!其实我发这个帖子提问就是想要这个答案。不好意思了,已经结贴了:( 没法给你分了
r4141496091 2009-11-01
  • 打赏
  • 举报
回复
finally 无论return写在哪里都要执行finally块
LC3TWZ 2009-11-01
  • 打赏
  • 举报
回复
建议LZ详细了解一下关于JAVA的内存存储方式 对return返回的内容和内存存储做一个了解 问题就可以解决了
whut0802 2009-11-01
  • 打赏
  • 举报
回复
学习了。。。
aa8945163 2009-11-01
  • 打赏
  • 举报
回复
都他妈废话,自己写一个,生成java文件,编译成.class类文件,然后反编译一下,或者在eclipse中跟踪就会知道啦。
具体的我在说一下,这里的代码运行的是先执行到try{}里面的语句,在try里面执行到return的时候,这时系统会返回,然而虚拟机不会这样执行他会判断一下有没有finally语句,然而要执行fnally语句的时候。他会保存return的现场,会用一个变量保存,但是在eclipse里面和在dos下执行的话,这个保存现场的变量声明的不一样,一个事char定义的变量保存,一个是byte类型的变量生成。
下面如果在finally里面执行在到这个修改返回变量的时候,就会又生成该变量的现场,但是不会保存,
执行完finally以后,在返回try里面的语句,这是由执行保存的现场,,所以返回的就是那个变量1啦。
SealedBook 2009-11-01
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 lc3twz 的回复:]
建议LZ详细了解一下关于JAVA的内存存储方式 对return返回的内容和内存存储做一个了解 问题就可以解决了
[/Quote]
好的!谢谢!
Agile牧 2009-11-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 amdgaming 的回复:]
Java code
为什么 因为你finally 没有 返回值,如果return j;就不一样了publicstaticvoid main(String[] args) {
System.out.println(test());

}
@SuppressWarnings("finally")publicstaticint test() {in¡­
[/Quote]
顶一楼 具体原因我也不解释了 很明显了 说的太白也没意思 lz实在搞不懂 可以多试试return语句 自己调试一下 这问题没什么技术含量
SealedBook 2009-10-31
  • 打赏
  • 举报
回复
得到答案了。有兴趣的朋友可以看一下这个链接:
http://zangxt.javaeye.com/blog/421508
谢谢各位的回答
SealedBook 2009-10-31
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 sodino 的回复:]
引用 4 楼 sealedbook 的回复:
引用 1 楼 amdgaming 的回复:
Java code
为什么 因为你finally 没有 返回值,如果return j;就不一样了publicstaticvoid main(String[] args) {
            System.out.println(test());

        }
        @SuppressWarnings("finally")publicstaticint test() {in¡­

amdgaming 感谢你的回答。
但是你能不能讲讲如果在不加return的情况下为什么不对?
程序finally是无论如何都会执行的,应该也是在try里return之前执行,在funally中已经改变了j变量的值。之后再return啊。


前提是try{}里没有return
[/Quote]
有return也是执行的。您可以写个程序来测试一下。
Sodino 2009-10-31
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 sealedbook 的回复:]
引用 8 楼 downmeim 的回复:
如果你把第一个return注释掉,再调试看看,那就是2了

恩,谢谢。这个我明白。
但是这个执行顺序是什么样的呢?
Java code
line1:j=1;
line2:System.out.println("try:"+ j);
//line2后执行return,本方法结果,不执行finally中的内容

j=2;
System.out.println("finally:"+ j);return j;
是这样么?
[/Quote]



所以顺序是:仅执行了try中的内容

haojia0716 2009-10-31
  • 打赏
  • 举报
回复
如果返回2那才叫奇怪
Sodino 2009-10-31
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 sealedbook 的回复:]
引用 1 楼 amdgaming 的回复:
Java code
为什么 因为你finally 没有 返回值,如果return j;就不一样了publicstaticvoid main(String[] args) {
            System.out.println(test());

        }
        @SuppressWarnings("finally")publicstaticint test() {in¡­

amdgaming 感谢你的回答。
但是你能不能讲讲如果在不加return的情况下为什么不对?
程序finally是无论如何都会执行的,应该也是在try里return之前执行,在funally中已经改变了j变量的值。之后再return啊。
[/Quote]

前提是try{}里没有return
mrs_xin 2009-10-31
  • 打赏
  • 举报
回复
因为只有一个return返回 你第一步有个return 结果 finally 必须执行 加入没有finally就不往下面执行 所以就是
SealedBook 2009-10-31
  • 打赏
  • 举报
回复
同样的意思换一种引用类型

public static void main(String[] args) {
Person p = new Person();
Person p1 = testPerson(p);
System.out.println(p1.name);
}

public static Person testPerson(Person p) {
try {
p.name = "try";
return p;
}catch (Exception e) {
}finally {
p.name = "finally";
}
p.name = "last";
return p;
}
}
class Person {
String name;
Person() {
}

难道是因为引用类型和值类型的差别吗?
wuhongen168 2009-10-31
  • 打赏
  • 举报
回复
同意一楼的!
SealedBook 2009-10-31
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 downmeim 的回复:]
如果你把第一个return注释掉,再调试看看,那就是2了
[/Quote]
恩,谢谢。这个我明白。
但是这个执行顺序是什么样的呢?

j = 1;
System.out.println("try:" + j);

j = 2;
System.out.println("finally:" + j);

return j;

是这样么?
downmeim 2009-10-31
  • 打赏
  • 举报
回复
如果你把第一个return注释掉,再调试看看,那就是2了
SealedBook 2009-10-31
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 amdgaming 的回复:]
呵呵,你单步调试下。。。加深 印象。。。
[/Quote]
好主意!
downmeim 2009-10-31
  • 打赏
  • 举报
回复
方法只有一个return能执行,程序最后的return并没有被调用,方法返回的是第一个return j,就是1了
amdgaming 2009-10-31
  • 打赏
  • 举报
回复
呵呵,你单步调试下。。。加深 印象。。。
加载更多回复(4)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧