java - 在java中设置最大递归深度
问题描述
我知道这个问题已经通过多种方法得到了回答:
- 设置最大堆栈大小 (
-Xss20m
) - 避免测试——如果你需要更大的递归,问题就在程序中。
这些方法很棒,但我知道我的代码存在问题,我想专门限制(例如 5 个小数字)递归深度,以测试这是否是问题所在。
有没有像sys.setrecursionlimit
python中的方法?
解决方案
执行此操作的侵入性最小的“手动”方法(也是最 hacky)可能是在您的类中创建一个存在递归问题的静态变量。当你进入递归方法时,使用它来计算递归深度(通过加法或减法),当你退出时,反转你在进入时所做的事情。
这不是很好,但它比尝试设置堆栈深度要好得多(Java 中几乎任何系统调用都会在不眨眼的情况下通过 5 级堆栈)。
如果您不使用静态变量,您最终可能不得不通过相当多的类传递堆栈深度变量,这对您的其余代码非常具有侵入性。
作为替代方案,我建议您让它“正常”失败并抛出异常,然后对堆栈跟踪进行一段时间的思考——它们确实提供了丰富的信息,并且可能会比其他任何事情更快地引导您找到问题的根源。
static int maxDepth = 5;
public void recursiveMethod() {
if(maxDepth-- == 0)
throw new IllegalStateException("Stack Overflow");
recursiveMethod();
maxDepth++;
}
推荐阅读
- angular - 在我的角度应用程序中创建服务的双重实例
- android - Google Playstore 被忽略 android minSDKVersion?
- highcharts - Highcharts 上的自定义标签显示百分比
- javascript - 重定向页面但仍然在 Laravel 上带来数据
- microsoft-teams - MS-Teams Deeplink 开始与机器人对话
- node.js - 从 CLI 反应开始设置端口号
- codenameone - iPhone 上的代号一 L10NManager.getInstance().formatDateLongStyle
- python - 将所有等于 x 的值更改为 y
- python - 如何使线程(馈线)在队列中添加一定数量的任务,然后等到第二个线程(消费者)完成它的工作
- python - 尝试使用 python/scrapy 提取数据但无法找到正确的 xpath