堆栈是从0还是1开始的?

时间:2019-05-02 11:28:24

标签: java recursion stack

所以我很好奇我是否可以实现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个“堆栈级别”吗?

1 个答案:

答案 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);
}