[英]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.