2013-08-21 3 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 продолжает увеличиваться в размере от 5 МБ до 43 МБ и т. Д., Когда я запускаю эту программу. – UnderDog

+1

Если ОП пытается поймать '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

Ваш метод просто создает бесконечный цикл и вызывает метод. Поскольку никаких исключений не выбрасывается, вы их не видите.

Смежные вопросы