2014-09-23 190 views
1

查询有关异常处理 c#和java的异常处理

作为I've read in C#终于块将不被时,有发生StackOverflowException因为没有房间在堆栈上,即使执行任何更多的代码和将当有一个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因为没有房间在堆栈上,即使执行的最后阻止任何更多的代码。即使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发现更多空间来调用finally块的方法?

谢谢。

+0

负面选民请在评论中提及理由。 – 2014-09-23 14:45:37

+1

虽然看起来您在这个问题上花费了大量精力,但它可能会从2-3行TL; DR;部分有明确的单个问题。 – 2014-09-23 14:47:19

+1

你的问题并不完全清楚,你试图解决什么**问题**?或者您是否在查询C#VS Java异常处理的行为? *你可以更清楚地概述你的意图吗?* – Greg 2014-09-23 14:47:24

回答

5

您的问题在Java catch区块中。 Exception不是所有可能错误的超类; Throwable是。 StackOverflowError延伸Error,而不是Exception,所以没有被捕获。优先捕获StackOverflowError本身,但也VirtualMachineError,ErrorThrowable将工作。

+0

我真的错过了它实际上是一见钟情的错误。仍然可以指出两种语言的输出差异? – 2014-09-23 14:58:40

+0

@joeyrohan我对C#一无所知,所以没什么我可以说的,但它在内部是如何工作的。 – bcsb1001 2014-09-23 15:06:06

+1

@ bcsb1001对不起,我完全改变了我的问题,但我的查询与堆栈的内部工作有关,但我很感谢你的回答。 – 2014-09-23 15:27:41