黑马程序员技术交流社区
标题:
一个Try catch的问题
[打印本页]
作者:
周朋飞
时间:
2012-6-28 14:00
标题:
一个Try catch的问题
package testDemo;
public class TestTryCatch {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(kkk());
}
public static int kkk() {
int k = 0;
try {
k += 2;
return k;
} catch (Exception e) {
k++;
return k;
} finally {
k += 5;
}
}
}
我明明看到debug的时候k 的值是7 可为什么返回的是2 呢
作者:
赵庆礼
时间:
2012-6-28 14:07
try块没有抛出异常,当执行k += 2;之后就会执行return k; 此时计算出了k的值为2,再执行finally块中代码,但不会影响要返回的值。
同样 如果try块中是return k+1; 那么结果是3
作者:
晁喆
时间:
2012-6-28 14:16
对于函数来说,返回值指在return语句执行时返回的值,finally语句是在return之后执行的,所以,并不会影响返回值,如果想达到要求,应该在finally里使用finally里返回。
对于完整的try catch finally来说,try中的语句应该尽量保证其正确性,而catch中应该是进行修正,而非简单的抛异常堆栈,而对于返回值要求严格的函数来说,你应该在finally里进行返回,而不是catch里边。
作者:
李伟
时间:
2012-6-28 14:18
我明明看到debug的时候k 的值是7 可为什么返回的是2 呢 //
因为finally里面执行完后k=7但是没有返回,如果在finally里面再加上return k,则输出结果会为7
作者:
揭耀祖
时间:
2012-6-28 14:18
如果你在finally里面用return k;的话,那么调用后返回的值就是7了。
作者:
胡文杰
时间:
2012-6-28 14:19
因为你的finally里面没有return 所以return的是2
作者:
吴扬
时间:
2012-6-28 14:20
try语句块中执行k += 2;这个语句之后k的值为2,然后就直接被return语句返回给了主函数,所以主函数接收到的返回值当然是2了。
作者:
常佳杰
时间:
2012-6-28 14:48
返回值会存起来..
你要是这样写就返回7了..
package testDemo;
public class TestTryCatch {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(kkk());
}
public static int kkk() {
int k = 0;
try {
k += 2;
return k;
} catch (Exception e) {
k++;
return k;
} finally {
k += 5;
return k;
}
}
}
要是后边又出现return就会覆盖前边储存起来的的值..
作者:
赵庆礼
时间:
2012-6-28 15:04
赵庆礼 发表于 2012-6-28 14:07
try块没有抛出异常,当执行k += 2;之后就会执行return k; 此时计算出了k的值为2,再执行finally块中代码, ...
如果catch中发生异常,将不会返回任何值,控制台上会抛出异常,但是finally中的语句还是会执行的
作者:
汪璨
时间:
2012-6-28 17:22
楼主,其实就是这个程序没有出现异常,所以直接执行了try里面的内容,try里面的语句执行后return了k的值,
finally里面的语句是执行了,但是没有返回K的值,所以打印的结果还是try里面返回的k的值,你想结果改变为7就在finally语句加上return,这样就把K的值改变了.
作者:
黑马刘杰
时间:
2012-6-28 17:50
return返回的结果将放置进函数栈中,此函数并不是马上返回,他要执行finally语句后才真正开始返回
作者:
黑马刘杰
时间:
2012-6-28 17:57
这个问题在张孝祥老师的java面试宝典里有介绍,下面有一个他写的程序可以说明这个问题
public class FinallyTest
{
public static void main(String[] args)
{
FinallyTest ft=new FinallyTest();
// System.out.println(ft.get());
System.out.println(ft.test());
}
public static int get()
{
try
{
return 1;
}
finally
{
return 2;
}
}
int test()
{
try
{
return func1();
}
finally
{
return func2();
}
}
int func1()
{
System.out.println("func1");
return 1;
}
int func2()
{
System.out.println("func2");
return 2;
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2