2014-09-23 323 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