簡體   English   中英

異常沒有拋出Java

[英]Exception not thrown Java

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”而不拋出異常。 任何人都可以告訴我為什么無限循環不作為例外處理? 或者這就是它的設計和應該工作的方式?

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

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

例如,如果你有方法my(); ITSELF只是調用my() ,然后你會立即得到一個StackOverflowError ,但這會在你的for(;;)循環的第一次迭代中發生。

要創建“溢出”條件,您實際上必須導致某些內容溢出。 像一個變量。

修改你的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.
     }
  }
}

這就是它設計和打算工作的方式 - 這就是所謂的停機問題 ,基本上意味着這是不可能的。

另一方面,如果你的方法是遞歸的,它將消耗越來越多的堆棧空間,直到拋出異常。

您的方法只是創建一個無限循環並調用方法。 由於沒有拋出異常,你沒有看到任何異常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM