public class Test {
public static void main(String[] args){
A a = new A();
a.foo();
}

}
class A{
public void foo(){
try{
System.out.println("try");
foo();
}catch (OutOfMemoryError e) {
System.out.println("catch");
foo();
}finally{
System.out.println("finally");
foo();
}
}
}求结果,求解释

解决方案 »

  1.   

    死循环,自己调用自己,又没有结束的条件。try了catch到异常还是foo(),最后finally也是回执行的,所以是个死循环
      

  2.   

    按程序的流程来走,应该一直递归下去,finally应该执行不到。那为什么finally会执行??求解释
      

  3.   

    StackOverflowError catch 这个异常,,,,
      

  4.   

    这是一道笔试题:我想知道输出结果里面为什么会有finally。
     
      

  5.   

    finally 是不管怎么样都会执行的
      

  6.   

    异常处理,不管有没有抛异常出来,finally是必须执行。 finally通常作用用来关闭连接资源,减少内存占有率。   在try语句块中加了finally,里面的内容是必须执行。
      

  7.   

    执行的结果:try
               finally
               try
               finally
               ...出现未知个,看你的内存大小能坚持多久.....
               catch
               finally
               catch
               finally
               ......出现未知个,尝试感觉一下你的CPU风扇的转速............
    后台不断的OutOfMemoryError e
             StackOverflowError 异常,,,,
     再下去的后果未知数。解释:先执行try{}
         finally无论是异常还是正常都执行
          执行到内存溢出,执行catch() finally{}
    所以打印出的结果是以上给出的结果。
      

  8.   

    有一个很奇怪的问题:如果直接运行的话,每次结果不一样,而且很没有规律,会输入finally
    但是,如果每次打印完之后sleep一段时间的话,发现打印的都是trypublic class TestThread
    {
    public static void main(String[] args) throws Exception
    {
    A a = new A();
    a.foo();
    }}class A
    {
    public void foo() throws Exception
    {
    try
    {
    System.out.println("try");
    Thread.sleep(500);
    foo();
    } catch (OutOfMemoryError e)
    {
    System.out.println("catch");
    Thread.sleep(500);
    foo();
    } finally
    {
    System.out.println("finally");
    Thread.sleep(500);
    foo();
    }
    }
    }要是这样的话就容易理解,因为foo递归调用自己,打印完“try”之后又进行新的调用,不会结束,所以不断打印“try”,因为中间没有出现exception,所以这个不会打印,而finally是要到最后才会执行的,也不会打印但是不知道为什么不加sleep的时候会有那样的结果
      

  9.   

    额。不带这么折腾内存的?
    finally总是会执行的。
      

  10.   

    跑了一遍
    tryfinallyfinally
    try
    try
    try
    try
    tryfinallyfinally
    tryfinallyfinally
    try
    tryfinallyfinally
    tryfinallyfinally
    try
    try
    tryfinallyfinally
    tryfinallyfinally
    try
    tryfinallyfinally
    tryfinallyfinally
    try
    try
    try
    tryfinallyfinally
    tryfinallyfinally
    try
    tryfinallyfinally
    tryfinallyfinally
    try
    try
    tryfinallyfinally
    tryfinallyfinally
    try
    tryfinallyfinally
    tryfinallyfinally
    try
    用的是公司电脑跑。。发现跟10楼得结果也不一样了。
      

  11.   

    有没有人来解释一下这个?public class TestThread
    {
        public static void main(String[] args) throws Exception
        {
            A a = new A();
            a.foo();
        }}class A
    {
        public void foo() throws Exception
        {
            try
            {
                System.out.println("try");
                Thread.sleep(500);
                foo();
            } catch (OutOfMemoryError e)
            {
                System.out.println("catch");    
                Thread.sleep(500);
                foo();
            } finally
            {
                System.out.println("finally");
                Thread.sleep(500);
                foo();
            }
        }
    }
    /*
     * output:
     * try
     * try
     * try
     * try
     * ...
     */
      

  12.   

    cpu处理速度快,多个线程同时运行的话,打印结果应该是没有规律性的而线程sleep,
      

  13.   

    LZ啊!!! 你到底想问啥呀?如过你问为什么finally会执行,一句话,不管有没有报错,finally都会执行,不然你用个报错的,catch也会跟着进来参合了,但是finally也会跟着进来。
      

  14.   

    死循环不断的finally永远被调用所以永远是foo()方法调用自己
      

  15.   

    呵呵...我没经过自己电脑测试,我不想这么折腾电脑,所以自己估算着出结果,仅供大家参考
    但是有点不明白的是15楼和18楼结果没有出现过catch,是不是从来不没有进到过chatch(){}块中,不解,哪位能在这解释一下么?
      

  16.   

    递归不是在同一个进程中完成的,所以代码中的catch是抓不到这个异常的,所以不会打印出“catch”。
    现在发生的异常是java.lang.StackOverflowError。
    发生异常时,自动调用了finally,所以打印出了“finally”。可以这么修改代码,就可以看到异常了。class A {
    public void foo() {
    try {
    System.out.println("try");
    foo();
    } catch (OutOfMemoryError e) {
    System.out.println("catch");
    foo();
    } finally {
    System.out.println("finally"); }
    }
    }输出结果:
    finally
    finally
    finally
    Exception in thread "main" java.lang.StackOverflowError
    at sun.nio.cs.ext.DoubleByteEncoder.encodeArrayLoop(Unknown Source)
    at sun.nio.cs.ext.DoubleByteEncoder.encodeLoop(Unknown Source)
    at java.nio.charset.CharsetEncoder.encode(Unknown Source)
      

  17.   

    递归不是在同一个进程中完成的,所以代码中的catch是抓不到这个异常的,所以不会打印出“catch”。
    现在发生的异常是java.lang.StackOverflowError。
    发生异常时,自动调用了finally,所以打印出了“finally”。可以这么修改代码,就可以看到异常了。class A {
    public void foo() {
    try {
    System.out.println("try");
    foo();
    } catch (OutOfMemoryError e) {
    System.out.println("catch");
    foo();
    } finally {
    System.out.println("finally"); }
    }
    }输出结果:
    finally
    finally
    finally
    Exception in thread "main" java.lang.StackOverflowError
    at sun.nio.cs.ext.DoubleByteEncoder.encodeArrayLoop(Unknown Source)
    at sun.nio.cs.ext.DoubleByteEncoder.encodeLoop(Unknown Source)
    at java.nio.charset.CharsetEncoder.encode(Unknown Source)
      

  18.   

    都没有debug走一下?
    谁能告诉我为什么debug情况一直打印try