public static int kkk() {
        int k = 0;
        try {
            k += 2;
            return k;
        } catch (Exception e) {
            k++;
            return k;
        } finally {
            k += 5;
        }
    }public static void main(String[] args){
    System.out.println(kkk());
}
为什么会等于2呢  debug 和 编译后 都应该等于7 我设置 k为全局 也是7 返回打印出来就是 2

解决方案 »

  1.   

    在try已经return了啊  如果把try中return放在最后  就会执行finally了
      

  2.   

    因为return的时候k为2啊,虽然后来k变成了7 ,
      int k = 0;
                try {
                    k += 2;
                    return 2;
                } catch (Exception e) {
                    k++;
                    return 0;
                } finally {
                    k += 5;
                }
    和这个是一个道理
      

  3.   

    http://topic.csdn.net/u/20120607/07/9d3a5948-ca38-4eb9-a4f8-63400b34e13a.html
      

  4.   

    在执行return的时候已经把return的当前的结果k复制一份存在了内存里, 之后的finally虽然改变了k,但是并没有改变return存在内存里的值.
      

  5.   

    try中的return语句调用的函数先于finally中调用的函数执行,也就是说return语句先执行,finally语句后执行,所以,返回的结果是2。Return并不是让函数马上返回,而是return语句执行后,将把返回结果放置进函数栈中,此时函数并不是马上返回,它要执行finally语句后才真正开始返回。
      

  6.   

    try中的return语句调用的函数先于finally中调用的函数执行,也就是说return语句先执行,finally语句后执行,所以,返回的结果是2。Return并不是让函数马上返回,而是return语句执行后,将把返回结果放置进函数栈中,此时函数并不是马上返回,它要执行finally语句后才真正开始返回。
      

  7.   

    try中的return语句调用的函数先于finally中调用的函数执行,也就是说return语句先执行,finally语句后执行,所以,返回的结果是2。Return并不是让函数马上返回,而是return语句执行后,将把返回结果放置进函数栈中,此时函数并不是马上返回,它要执行finally语句后才真正开始返回。
      

  8.   

    不论是否return,finally一定会执行,但执行后这个值也许不是你获取到的那个值,在楼主例子中return 先执行,于是返回值为2,finally后执行,于是在该方法体中的局部变量k被赋值为7,但k的赋值改变并不会影响已经返回的2。
      

  9.   

    这样就等于7喽public class 等于7 { /**
     * @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;
            }
        }
    }
      

  10.   

     因为finally 是无论如何都会执行的,不管你try块里面是否有异常啊!!!
      

  11.   

    这个和我发的帖子几乎是一模一样的。
    http://www.oschina.net/code/snippet_579674_13049
    去看看吧。有解答。
      

  12.   

    因为你在try中已经把值return了。
      

  13.   

    因为你先return了 所以后面finally里面的对k的操作已经不起作用了  除非你在代码最后return
      

  14.   

    系统正在try里面运行到return,会找一下有没有finally块,如果有finally会先执行finally块,如果finally没有return结束方法,系统会再跳回来try块。另外try块里的变量k是临时变量,只在try块有效,和finally的k是不一样的。
      

  15.   

    这个是java常见的面试题目额,不难理解啊
      

  16.   

    return之后的代码不执行的,k更本就不可能变成7.public static int kkk() {
            int k = 0;
            try {
                k += 2;
                int c = 0 / 0;
                return k;
            } catch (Exception e) {
                k++;
                return k;
            } finally {
                k += 5;
                return k;
            }
        }
    }上面的代码输出3;public static int kkk() {
            int k = 0;
            try {
                k += 2;
                int c = 0 / 0;
                return k;
            } catch (Exception e) {
               
            } finally {
                k += 5;
                return k;
            }
        }
    }上面的代码输出7;
    输入几, 关键是看return的位置
      

  17.   


    [Quote=引用 22 楼  的回复:]
    public static int kkk() {
            int k = 0;
            try {
                k += 2;
                int c = 0 / 0;
                return k;
            } catch (Exception e) {
                k++;
                return k;
            } finally {
                k += 5;
                return k;
            }
        }
    }
    这个返回的是8,不是3