异常没有抛出Java

时间:2013-08-21 03:56:38

标签: 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”而不抛出异常。 任何人都可以告诉我为什么无限循环不作为例外处理? 或者这是它的设计和应该工作的方式?

4 个答案:

答案 0 :(得分:7)

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

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

例如,如果您使用方法my(); ITSELF只需调用my(),那么您会立即获得StackOverflowError,但这会在您{的第一次迭代时发生{1}}循环。

答案 1 :(得分: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.
     }
  }
}

答案 2 :(得分:0)

这就是它设计和打算工作的方式 - 这个叫做Halting problem的东西基本上意味着这是不可能的。

另一方面,如果你的方法是递归的,那么在抛出异常之前会占用越来越多的堆栈空间。

答案 3 :(得分:0)

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