困惑于try-catch-finally问题?

时间:2013-11-06 10:03:33

标签: java exception try-catch-finally

我试图找出try-catch-finallyjava的执行顺序。我认为执行顺序应该是

  1. 尝试
  2. catch(如果发生错误/捕获异常)
  3. 最后(无论是否被捕获)
  4. 但我对以下

    的结果感到困惑
    public class TryCatchFinally {
    static int i = 0;
    public static void main(String[] args) {
        try {
            System.out.println(i++);
            main(args);
        } catch (StackOverflowError e) {
            System.out.println("Catch");
        } finally {
            System.out.println("Finally");
        }
     }
    }
    

    输出(输出的一部分)

    9127
    9128
    9129
    9130
    CatcFCatch // what is the wrong here???
    Finally
    Finally // there are more Finally printed here.
    

    我的问题是这里到底发生了什么?

    让我添加更多为什么它不打印"Catch" ???

    我在IntelliJ IDEA中运行此功能时将其输出。但是当我在terminal中跑步时,我会按照以下方式进行操作。

    9151
    9152
    9153
    9154CatchFinallyCatch
    Finally
    Finally
    Finally
    Finally
    

3 个答案:

答案 0 :(得分:7)

您可能会在println调用中遇到堆栈溢出错误某处(可能是因为正在进行某些刷新或类似事件),将println方法保留在不一致的状态(打印了部分它应该是什么)。

已经处理StackOverflowError时很容易发生这种情况,因为此时你已经危险地接近溢出的堆栈了(因为你刚从一个堆栈中恢复过来)非常接近问题)。

我的解释看起来像这样:

  • 主要递归调用很多......
  • 你递归第9130次主叫
  • 打印该号码
  • 它自称为第9131次
  • 它会尝试打印该号码,但会抛出StackOverflowError,因为堆栈已满
  • 您输入了捕获并尝试打印“Catch”
  • println来电期间发生另一个StackOverflowError
  • 执行finally块,因为catch块已完成(突然)
  • 它试图打印“终于”
  • 期间 println致电又发生了 StackOverflowError
  • StackOverflowError
  • 的第9130次调用中发现了main
  • 它打印“Catch”(成功,因为堆栈现在缩短1个元素!)
  • 执行finally块并成功打印Finally,因为堆栈现在缩短了1个元素。
  • more finally blocks execute。

答案 1 :(得分:1)

这是因为对main的递归调用。因此,当您在main中调用main时,您将多次输入try catch块,并且在第一次StackOverflow出现后您从它返回的次数与您输入的次数相同。这是多个财务的原因。

编辑: 当我看到一些downvotes,没有任何合理的解释,如果有人认为我错了,只需打印该死的i计数器,并在最后一个块中减少。

public static void main(String[] args) {
    try {
        System.out.println(i++);
        main(args);
    } catch (StackOverflowError e) {
        System.out.println("Catch");
    } finally {
        System.out.println("Finally: "+ (i--));
    }
 }

答案 2 :(得分:0)

您使用的是IDE(日食或类似物),如果是,则可能是由于此原因。

以下是我尝试的结果 -

//代码

public static void main(String[] args) throws IOException {

    File file = new File("resources/ouput.txt");
    file.createNewFile();
    PrintStream printStream = new PrintStream(file);
    System.setOut(printStream);

    overflowTester(0);

}

private static void overflowTester(int index) {
    try {
        System.out.println(index++);
        overflowTester(index);
    } catch (StackOverflowError  e) {
        System.out.println("Catch");
    } finally {
        System.out.println("Finally");
    }
}

//输出

0
1
2
3
4
5
6
7
8
9
10
...
...
...
9666
Catch
Finally
...
...
Finally

注意:'9666'印在第9667行,最后一个终止于19336行。

就我而言,运行以下程序:

private static int index = 0;

public static void main(String[] args) throws IOException {

    try {
        System.out.println(index++);
        main(args);
    } catch (StackOverflowError  e) {
        System.out.println("Catch");
    } finally {
        System.out.println("Finally");
    }

}
来自命令提示符的

产生了类似的结果:

0
1
2
3
4
5
...
...
9667
Catch
Finally
...
...
Finally

在第9668行打印'9667',在19338行打印最后'最后'。