与异常处理相关的查询

时间:2014-09-23 14:39:35

标签: java c# exception stack-overflow

我为 c#和java 异常处理提供了一些代码。

作为StackOverflowException时,I've read in C#最终阻止将不会被执行,因为堆栈上没有空间甚至不再执行任何代码,它也不会当出现ExecutionEngineException时会被呼叫,这可能是因为拨打Environment.FailFast()而产生的。

在我的下面的代码( C#)中,我故意生成StackOverflowException

 class overflow1

    {

      public  void disp()

        {
            try
            {
                Console.WriteLine("disp");
                disp();
            }

            catch(Exception e) {
                Console.WriteLine(e);
                Console.WriteLine("catch");
            }

            finally {
                Console.WriteLine("finalyyy");
            }
        }
    }

    class ExceptionHandling
    {
        static void Main() {

                overflow1 s = new overflow1();

                s.disp();

            Console.Read();
        }
    }

输出:

DISP

DISP

DISP

由于StackOverFlowException

,进程终止

正如我所说的那样StackOverflowException发生了,因为堆栈上没有空间甚至不再执行finally块的代码。即使catch块的方法也未被调用,可能是由于相同的原因(堆栈中没有剩余空间)。

现在我已经在 java

中尝试了相同的代码
public class ExceptionHandlingTest {

  static  int count1 = 0 ,count2=0;
    static void disp()
    {

        try{

            System.out.println("disp"+(++count1));
            disp();

        }catch(StackOverflowError e){

             System.out.println(e);
             System.out.println("catch");
             System.exit(0);

        }finally{

         System.out.println("handle"+(--count1));

        }
    }

    public static void main(String... args)

    {
        disp();
    }
}

输出

DISP1

DISP2

disp2456

handle2455

handle2454

线程中的异常" main" java.lang.StackOverflowError的

handle2

句柄1

handle0

修改 实际上我的问题是代码的行为应该在两种语言中都是相同的,因为如果填充了所有堆栈空间,那么java JVM中如何找到更多空间来调用最终的块方法?

感谢。

1 个答案:

答案 0 :(得分:5)

您的问题出在Java catch块中。 Exception不是所有可能错误的超类; Throwable是。 StackOverflowError延伸Error,而非Exception,因此未被捕获。优先捕获StackOverflowError本身,VirtualMachineErrorErrorThrowable也可以。