2013-08-21 226 views
4
class ex1 
{ 
    static void my() { 
     System.out.println("asdsdf"); 
    } 

    public static void main(String args[]) { 

     try { 
      for (;;) { 
       my(); 
      } 
     } catch (Exception e)//Exception is not caught //Line 1 
     { 
      System.out.println("Overflow caught"); 
     } finally { 
      System.out.println("In Finally"); 
     } 
     System.out.println("After Try Catch Finally..."); 

    } 
} 

catch語句(第1行)不處理溢出異常,因此輸出持續打印「asdsdf」而不拋出異常。 任何人都可以告訴我爲什麼一個無限循環不作爲異常處理? 或者這是它的設計和應該工作的方式?未拋出的異常Java

+1

我看不到這個代碼實際上會產生任何類型的異常。 – MadProgrammer

+1

什麼溢出?你真的知道「溢出」是什麼嗎? –

+0

沒有'OverflowException'這樣的事情。 – erickson

回答

7

異常不會被捕獲,因爲它永遠不會被拋出。你的方法不會導致OverflowException。

無限循環在Java中是完全合法的。它將繼續無限期地運行。你的循環也沒有建立越來越多的資源,它只是簡單地調用一個方法,在打印到標準輸出後,每一次迭代都會自行破壞。它可以永遠運行。

如果,例如,有方法my();本身只需撥打my(),那麼你馬上會得到一個StackOverflowError,但這種情況會發生在你的for(;;)循環的第一個迭代。

+0

「你的循環也沒有構建越來越多的資源」,但是當我執行這個程序時,java.exe的大小從5MB增加到43MB等等。 – UnderDog

+1

如果OP試圖捕獲一個'StackOverflowError',那麼' try-catch「也行不通 - 只是指出來;) – MadProgrammer

+0

@MadProgrammer如果他抓住Throwable,它可以被抓住。 'catch(Throwable e)' –

0

這就是它設計和打算工作的方式 - 這就是所謂的Halting problem這基本上意味着這將是不可能的。

另一方面,如果您的方法是遞歸的,它會消耗越來越多的堆棧空間,直到引發異常爲止。

1

要創建一個「溢出」條件,你實際上必須導致某些東西溢出。就像一個變量。

修改您的for語句以增加某些內容,但不對循環的連續性設置任何約束,則會出現整數溢出。

for (int i=0;;i++) { 
} 

或者,

for (int i=0;i==i;i++) { // i==i is always true. 
} 

另一種方法是使呼叫堆棧溢出,通過遞歸地調用自身沒有限制。每次遞歸調用都必須保留先前遞歸調用的堆棧。

遞歸函數

public static my(){ 
    my(); 
} 

遞歸構造

class My { 
    My my; 
    My() { 
    try{ 
     my = new My(); 
    } 
    catch (Exception e){ 
     // print exception. 
    } 
    } 
} 
0

你的方法只是創建一個無限循環,並調用的方法。由於沒有任何例外,你沒有看到任何。