废话不说,大家直接来看源代码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?
在这里,小弟谢谢各位!
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?
在这里,小弟谢谢各位!
为什么 因为你finally 没有 返回值,如果return j;就不一样了
public static void main(String[] args) {
System.out.println(test()); }
@SuppressWarnings("finally")
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;
}
//return j;
}
但是你能不能讲讲如果在不加return的情况下为什么不对?
程序finally是无论如何都会执行的,应该也是在try里return之前执行,在funally中已经改变了j变量的值。之后再return啊。
但是这个执行顺序是什么样的呢?j = 1;
System.out.println("try:" + j);j = 2;
System.out.println("finally:" + j);return j;是这样么?
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() {
} 难道是因为引用类型和值类型的差别吗?
所以顺序是:仅执行了try中的内容
http://zangxt.javaeye.com/blog/421508
谢谢各位的回答
具体的我在说一下,这里的代码运行的是先执行到try{}里面的语句,在try里面执行到return的时候,这时系统会返回,然而虚拟机不会这样执行他会判断一下有没有finally语句,然而要执行fnally语句的时候。他会保存return的现场,会用一个变量保存,但是在eclipse里面和在dos下执行的话,这个保存现场的变量声明的不一样,一个事char定义的变量保存,一个是byte类型的变量生成。
下面如果在finally里面执行在到这个修改返回变量的时候,就会又生成该变量的现场,但是不会保存,
执行完finally以后,在返回try里面的语句,这是由执行保存的现场,,所以返回的就是那个变量1啦。