public int inc() { int x; try { x = 1; return x; } catch (Exception e) { x = 2; return x; } finally { x = 3; } }
public StringBuffer inc(StringBuffer x) { try { x.append("1"); x = new StringBuffer(); return x; } catch (Exception e) { x.append("2"); return x; } finally { x.append("3"); x = new StringBuffer("4"); } }
public static void main(String[] args) { int x = new Test().inc(); System.out.println(x); StringBuffer x1 = new StringBuffer(), x2 = new Test().inc(x1); System.out.println(x1); System.out.println(x2); } }
异常 参数 Java [解决办法]
目测是 1 1 3
[解决办法] System.out.println(x);//输出1,因为方法返回的是1,虽然finally会被执行 StringBuffer x1 = new StringBuffer(), x2 = new Test().inc(x1);
//输出1,传递的是一个对象的“复本”修改的是对象指向的内容 System.out.println(x1); //输出3,finally怎样都会执行,因为其修改了地址里面的内容 System.out.println(x2); [解决办法] 答案是:1,1,3。第一为1,还可以理解,int x = new Test().inc()里面,因为在进入finally语句块之前,会有一个暂时保存的过程,即会X的值暂时保存在一个局部变量里面,运行完finally语句块之后再到那个局部变量里面拿,所有X的值不管你在finally里面怎么改,它都将是1. 但是我不理解的是第二个和第三个。楼主帮讲解一下。谢谢
X1是StringBuffer类型的,传到inc(StringBuffer x)里面的就是它的内存地址,也就是说inc(StringBuffer x)里面的x 就是x1的引用,然后 x.append("1");x = new StringBuffer(); 这样的话,x就是空的,x1自然也是空的啊。为什么还有值呢?求详细解释。。 [解决办法]
答案是:1,1,3。第一为1,还可以理解,int x = new Test().inc()里面,因为在进入finally语句块之前,会有一个暂时保存的过程,即会X的值暂时保存在一个局部变量里面,运行完finally语句块之后再到那个局部变量里面拿,所有X的值不管你在finally里面怎么改,它都将是1. 但是我不理解的是第二个和第三个。楼主帮讲解一下。谢谢
这种问题,只要想明白修改的是什么就ok了 修改的是内存地址,还是地址里面的内容
X1是StringBuffer类型的,传到inc(StringBuffer x)里面的就是它的内存地址,也就是说inc(StringBuffer x)里面的x 就是x1的引用,然后 x.append("1");x = new StringBuffer(); 这样的话,x就是空的,x1自然也是空的啊。为什么还有值呢?求详细解释。。
x,x1同一块内存区域, 之后x重新指向另一块区域,x1又没有变啊 [解决办法]
答案是:1,1,3。第一为1,还可以理解,int x = new Test().inc()里面,因为在进入finally语句块之前,会有一个暂时保存的过程,即会X的值暂时保存在一个局部变量里面,运行完finally语句块之后再到那个局部变量里面拿,所有X的值不管你在finally里面怎么改,它都将是1. 但是我不理解的是第二个和第三个。楼主帮讲解一下。谢谢
这种问题,只要想明白修改的是什么就ok了 修改的是内存地址,还是地址里面的内容
X1是StringBuffer类型的,传到inc(StringBuffer x)里面的就是它的内存地址,也就是说inc(StringBuffer x)里面的x 就是x1的引用,然后 x.append("1");x = new StringBuffer(); 这样的话,x就是空的,x1自然也是空的啊。为什么还有值呢?求详细解释。。
答案是:1,1,3。第一为1,还可以理解,int x = new Test().inc()里面,因为在进入finally语句块之前,会有一个暂时保存的过程,即会X的值暂时保存在一个局部变量里面,运行完finally语句块之后再到那个局部变量里面拿,所有X的值不管你在finally里面怎么改,它都将是1.