看这两个程序的输出结果是什么?(先做下试试,再测试~)public class Test
{
public static void main(String[] args)
{
System.out.println(tryTest());
} private static int tryTest()
{
int i = 0;
try
{
i = 1;
return i; //1处
}
catch (Exception e)
{
i = 2;
return i;
}
finally
{
i = 3;
}
}
}和public class Test
{
public static void main(String[] args)
{
System.out.println(tryTest());
} private static int tryTest()
{
int i = 0;
try
{
i = 1;
return i+0; //2处
}
catch (Exception e)
{
i = 2;
return i;
}
finally
{
i = 3;
}
}
}
{
public static void main(String[] args)
{
System.out.println(tryTest());
} private static int tryTest()
{
int i = 0;
try
{
i = 1;
return i; //1处
}
catch (Exception e)
{
i = 2;
return i;
}
finally
{
i = 3;
}
}
}和public class Test
{
public static void main(String[] args)
{
System.out.println(tryTest());
} private static int tryTest()
{
int i = 0;
try
{
i = 1;
return i+0; //2处
}
catch (Exception e)
{
i = 2;
return i;
}
finally
{
i = 3;
}
}
}
public class Test
{
public static void main(String[] args)
{
System.out.println(tryTest());
} private static int tryTest()
{
int i = 0;
try
{
i = 1;
return i+0000; //2处 不管多少个0
}
catch (Exception e)
{
i = 2;
return i;
}
finally
{
i = 3;
}
}
}1+0 和 1+0000 没什么区别。
之前已经return了
仁兄运行了代码没
可以这样加个打印信息再看看执行不 finally
{
System.out.println("------1------");
i = 3;
System.out.println("------2------");
}
只是返回值仍是1
如果这样子,就不一样了
private static int tryTest() {
int i = 0;
try {
i = 1;
return i+0; // 1处
} catch (Exception e) {
i = 2;
return i;
} finally {
i = 3;
return i;
}
}
public static void main(String[] args) {
System.out.println(tryTest());
}
不过大家 把代码稍微改一下 即知道答案
finally {
System.out.println("------1------");
i = 3;
System.out.println("------2------");
}或者 用eclipse 调试一下 也可以看到答案
我不赞同这种答案,结果是1,不错;可是,记得fianally的语句块是一定要执行的,只是它的执行不影响结果而已
{
System.out.println(tryTest());
} private static int tryTest()
{
Integer i = 0;
try
{
i = 1;
return i; //1处
}
catch (Exception e)
{
i = 2;
return i;
}
finally
{
i = 3;
return i;
}
}}
{ public static void main(String[] args)
{
System.out.print(Test.testFinally(0) + "\t");
} private static StringBuffer testFinally(int flg)
{
StringBuffer result = new StringBuffer(""); result.append("1");
try
{
result.append("2");
return result; //1处
}
catch (Exception e)
{
return result;
}
finally
{
result.append("4");
}
}
}和public class Test2
{
public static void main(String[] args)
{
System.out.print(Test2.testFinally() + "\t");
} private static String testFinally()
{
StringBuffer result = new StringBuffer("");
result.append("1");
try
{
result.append("2");
return result.toString(); //2处
}
catch (Exception e)
{
return result.toString();
}
finally
{
result.append("4");
}
}
}
我的观点是返回值都是1。
因为,不论什么情况,finally都会执行,而且是在return之前执行。
但是,在finally里面的赋值是无效的。i是值变量,在try里面写了return i; 这时虚拟机栈已经把 i 这时的值copy到栈顶,然后才再去处理finnaly,之后对 i进行任何改变不会影响这时候栈顶的这个返回值,只会影响 i 的值。所以尽管此时i的值变了,但那是 i 的事情,不是Return的事情
如果在finnaly里面也加了return的话,这时候虚拟机栈又会把 i的值copy到return的栈顶。那么你看到的输出就不一样了!!
这里又是符合了java严格意义上的单向值传递。例如使用list,finally中你依旧可以向其中添加数据,但是若你想
list= null;却是没有作用的。已经存入栈顶的元素是一个深拷贝。
看这个代码:
public class Test
{
public static void main(String[] args)
{
System.out.println(tryTest());
} private static int tryTest()
{
int i = 0;
try
{
i = 1;
throw new Exception();
}
catch (Exception e)
{
i = 2;
return i;
}
finally
{
i = 3;
System.out.println(i);
return i;
}
}
}
请看完整。18楼和20楼,我的答复原本应该是在一起的。
而且你的finally里面加了return语句,重新更改了栈顶元素的值,就是重新进行了一次深拷贝。
我说的有问题吗?
至于16楼的不一样,就好比传String参数和StringBuffer参数的道理一样,引用的值是不变,引用所指的对象已经变了。
return new String(value, 0, count);
}
public class Test {
public static void main(String[] args) {
int a = tryTest(); //第1步(此时a=1) 第7步
System.out.println(a); //第8步
} private static int tryTest() {
int i = 0; //第2步
try {
i = 1; //第3步
return i; //第4步 (执行了finally的i=3;之后再转回执行这句所以这也是 第6步)
} catch (Exception e) {
i = 2;
return i;
} finally {
i = 3; //第5步(此时i=3)
}
}
}只是大概写了下步骤,再结合18楼的说法,这个题差不多可以解决了。
引用下18楼的:
i是值变量,在try里面写了return i; 这时虚拟机栈已经把 i 这时的值copy到栈顶,然后才再去处理finnaly,之后对 i进行任何改变不会影响这时候栈顶的这个返回值,只会影响 i 的值。所以尽管此时i的值变了,但那是 i 的事情,不是Return的事情
如果在finnaly里面也加了return的话,这时候虚拟机栈又会把 i的值copy到return的栈顶。那么你看到的输出就不一样了!!
而在try-catch语句中,无论是否有异常抛出或者使用的return语句,finally块语句都会被执行。
这位仁兄说的对。。 不错 如果在 finally那位置在加个 return i 那就是3啦
2.try出错-->catch-->finally
LZ是想明白执行顺序吧?
那个finally执行了,不过在执行前已经return i值了。
所以。。