void tryCatchFinally() {
try {
tryItOut();
} catch (TestExc e) {
handleExc(e);
} finally {
wrapItUp();
}
Method void tryCatchFinally()
0 aload_0 // Beginning of try block
1 invokevirtual #4 // Method Example.tryItOut()V
4 goto 16 // Jump to finally block
7 astore_3 // Beginning of handler for TestExc;
// Store thrown value in local var 3
8 aload_0 // Push this
9 aload_3 // Push thrown value
10 invokevirtual #6 // Invoke handler method:
// Example.handleExc(LTestExc;)V
13 goto 16 // This goto is unnecessary, but was
// generated by javac in JDK 1.0.2
16 jsr 26 // Call finally block
19 return // Return after handling TestExc
20 astore_1 // Beginning of handler for exceptions
// other than TestExc, or exceptions
// thrown while handling TestExc
21 jsr 26 // Call finally block
24 aload_1 // Push thrown value...
25 athrow // ...and rethrow value to the invoker
26 astore_2 // Beginning of finally block
27 aload_0 // Push this
28 invokevirtual #5 // Method Example.wrapItUp()V
31 ret 2 // Return from finally block
Exception table:
From To Target Type
0 4 7 Class TestExc
0 16 20 any
你好,我们有一个方法,正如我们在上面的代码中指定的。你可以在下面看到这个代码的字节码输出
我的问题是…如果tryItOut((方法得到一个stackerflow错误。Jvm如何最终阻止并返回。我们已经没有记忆了。jvm中如何处理此过程。
假设堆栈上已经有50个方法,然后调用一些递归代码,如下所示:
try {
recursiveCall();
} catch (StackOverflowError e) {
...
}
这种递归方法深入了大约40个层次,然后就出现了SOErrs。
这意味着所有40个方法最终都会被"分解"(堆栈上这40个方法中的每一个都以可丢弃的方式返回(,然后它会到达您的catch块。现在这个堆栈上有大约40种方法的操作空间,你会没事的。
在一个有点奇怪的场景中,堆栈几乎满了,您甚至调用了一个方法,这会导致您立即捕获的SOErr,您会受到很大的阻碍;在catch (StackOverflowError e)
处理程序中,您尝试做的大多数事情本身都会抛出该异常,而try/catch块本身并不适用,因此它只会出现气泡,在执行过程中分解方法,从而创建空间。
CCD_ 2也不例外。除非[A]try块正常完成,或者[B]它抛出了一些东西,可选地到达某个异常处理程序(它也必须完成(,然后它到达finally,否则你不会到达finally。换句话说,如果由于StackOverflowError而导致finally
块,问题出在哪里?现在有一大堆房间可用,SOER沿着烟囱向上移动,一边移动一边腾出空间。