Try finally阻止堆栈溢出错误

请看以下两种方法:

公共静态void foo(){
试一试{
foo();
}最后{
foo();
}
}
公共静态无效条(){
bar();
}

运行bar()<为什么会这样?

它不会永远运行。每个堆栈溢出都会导致代码移动到finally块。问题是这将需要非常非常长的时间。时间顺序为O(2^N),其中N是最大堆栈深度

假设最大深度为5

foo()调用
foo()调用
foo()调用
foo()调用
调用foo()失败的foo()
最后打电话
调用foo()失败的foo()
最后
foo()调用
调用foo()失败的foo()
最后打电话
调用foo()失败的foo()
最后打电话
foo()调用
foo()调用
调用foo()失败的foo()
最后打电话
调用foo()失败的foo()
最后
foo()调用
调用foo()失败的foo()
最后打电话
调用foo()失败的foo()
最后打电话
foo()调用
foo()调用
foo()调用
调用foo()失败的foo()
最后打电话
调用foo()失败的foo()
最后
foo()调用
调用foo()失败的foo()
最后打电话
调用foo()失败的foo()
最后打电话
foo()调用
foo()调用
调用foo()失败的foo()
最后打电话
调用foo()失败的foo()
最后
foo()调用
调用foo()失败的foo()
最后打电话
调用foo()失败的foo()

要将每一层工作到finally块中,需要两倍于堆栈深度的时间
一万或更多。如果你能每秒拨打10000000个电话,这将花费10^3003秒或比宇宙年龄更长的时间

发表评论