3
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”而不抛出异常。谁能告诉我为什么不将无限循环作为异常处理?或者这就是它的设计和应该工作的方式?

4

4 回答 4

7

异常不会被捕获,因为它永远不会被抛出。您的方法不会导致溢出异常。

无限循环在 Java 中是完全合法的。它将无限期地继续运行。您的循环也没有构建越来越多的资源,它只是调用一个方法,该方法在打印到标准输出后自毁每次迭代。它可以永远运行。

例如,如果您让方法my();ITSELF 简单地调用my(),那么您将立即得到 a StackOverflowError,但这会发生在for(;;)循环的第一次迭代中。

于 2013-08-21T03:58:42.453 回答
1

To create an "overflow" condition, you actually have to cause something to overflow. Like a variable.

Modify your for statement to increment something but do not place any constraint on the continuity of the loop, then there would be an integer overflow.

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

Alternatively,

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

Another way is to cause a call stack overflow, by recursively calling itself without limit. Each recursive call has to preserve the stack of the preceding recursive call.

Recursive function:

public static my(){
  my();
}

Recursive constructor:

class My {
  My my;
  My() {
     try{
       my = new My();
     }
     catch (Exception e){
        // print exception.
     }
  }
}
于 2013-08-21T04:51:00.920 回答
0

您的方法只是创建一个无限循环并调用一个方法。由于没有抛出异常,因此您看不到任何 .

于 2013-08-21T04:55:00.727 回答
0

这就是它的设计和工作方式——有一个叫做停机问题的东西,基本上意味着这是不可能的。

另一方面,如果您的方法是递归的,它将消耗越来越多的堆栈空间,直到引发异常。

于 2013-08-21T04:06:30.790 回答