【发布时间】:2019-09-20 22:01:04
【问题描述】:
所以我很好奇是否可以对 Java 实现递归限制,并在链接中发现了这段代码: Set maximum recursion depth in java
getStackTrace().length 从几开始计数? 0 还是 1? “堆栈”从几号开始? 0 还是 1?
public class RecursionLimiter {
public static int maxLevel = 10;
public static void emerge() {
if (maxLevel == 0)
return;
try {
throw new IllegalStateException("Too deep, emerging");
} catch (IllegalStateException e) {
if (e.getStackTrace().length > maxLevel + 1)
throw e;
}
}
}
public class RecursionLimiter {
public static int maxLevel = 10;
public static void emerge() {
if (maxLevel == 0)
return;
try {
throw new IllegalStateException("Too deep, emerging");
} catch (IllegalStateException e) {
if (e.getStackTrace().length > maxLevel) {
System.out.println(e.getStackTrace().length);
throw e;
}
}
}
}
public static void main(String[] args) {
// TODO code application logic here
printRecursively(8);
}
public static void printRecursively(int n) {
RecursionLimiter.emerge();
if (n == 1) {
System.out.println(1);
return;
}
System.out.println(n);
printRecursively(n-1);
}
我使用了以上两个类,它似乎停止在 printRecursively(9) [in main()];这意味着自从抛出异常以来堆栈已经达到 10。
后台发生了什么? 通过运行 printRecursively() [“第一次迭代”],它是否被添加到堆栈中?即使那样 printRecursively(9) 不应该只使用 9 个“堆栈级别”吗?
【问题讨论】:
-
索引从 0 开始
-
@AxelH 从你的意思来看,我知道,虽然索引从 0 开始,但它充满了一个“虚拟”条目,使实际的第一项索引从 1 开始。是正确的(同样,这也适用于每个 Collection 实现)。
-
写错字了!我移除了那个怪物。长度只是计算
Stack中的项目数。所以空栈的长度为0。添加项目时,该项目的索引为0,堆栈的长度为1。其中有一个新项目,length = 2,index = 1 -
@AxelH 好的,谢谢。然后它的工作方式类似于普通数组:)