所以我很好奇我是否可以实现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)[main()]中停止工作了;这意味着自引发异常以来堆栈已达到10。
后台发生了什么? 通过运行printRecursively()[“第一次迭代”],它是否被添加到堆栈上?即使那样,printRecursively(9)也不应该仅使用9个“堆栈级别”吗?
答案 0 :(得分:0)
getStackTrace()是一个非常慢的方法(这就是将异常视为慢的原因)。切勿将其用于常规程序流程(Effective Java, item 57)。如果要实现递归限制,请为递归方法提供递减计数器:
public static void printRecursively(int n, int depth) {
if (depth == 0)
... stop recursing
System.out.println(n);
printRecursively(n-1, depth - 1);
}