【问题标题】:StackOverflowError on recursive method call递归方法调用上的 StackOverflowError
【发布时间】:2014-07-07 21:07:44
【问题描述】:

我遇到以下问题:我想制作一个程序,将数据列表(它将是纬度/经度、ICAO 等机场信息)转换为数据库,我不仅可以对它们进行排序,而且然后有一种方法打印出某些脚本,用于以不同方式需要数据的其他程序。

我设法创建了一个列表,该列表将原始数据(来自 .txt)按不同的机场进行拆分,以便每个元素都包含一个(例如(12921, 'CYAC', 'Cat Lake Airport', 'CA', 51.7272, -91.8244, 0, 0, ''))。当我尝试使用例如通过调用返回列表中下一个元素的值加上它自己的值的递归方法来计算列表的方法时,我在带有if(next!=null) 的行中得到一个StackOverflowError。这是方法本身:

public int getLength(){
    if(next!=null){
        return next.getLength()+1;
    }
    else{
        return 1;
    }
}

机场的数量在 42000 左右,但它(显然)创建了 42000 个对象就好了,只是不想通过它们。

关于如何避免该错误的任何想法?数组会更智能吗?感谢您的帮助,最好的问候!

【问题讨论】:

  • 循环不是更简单吗?
  • 您将使用当前的方法非常快速地访问 Java 的 recursive limit。为什么需要递归解决方案?
  • 我使用了递归的,因为这是我们在学校学到的最好的东西......显然不适合那种尺寸:)
  • 你可以让它尾递归并使用accumulator

标签: java arrays recursion stack-overflow


【解决方案1】:

您有两种可能的选择。

  1. 将递归替换为简单循环,甚至是非迭代公式:行中第 i 个项目的 getLength()n - i + 1 其中n 是列表长度,假设第一个项目的索引为 1;

  2. [不推荐]通过在启动 JVM 的命令中添加 -Xss100m(或您认为合适的任何其他大小)标志来增加 JVM 堆栈大小;

【讨论】:

    【解决方案2】:

    你得到一个 stackOverflow,因为 java 堆栈不是那么大。 您应该使用类似于以下的迭代算法:

    public int getLength(){
        MyObject cursor = this;
        int length = 0;
        while (cursor != null) {
           length += 1;
           cursor = this.next;
        }
    }
    

    其中 MyObject 是当前类。

    【讨论】:

    • 哦,这个主意太棒了,非常感谢,马上试试!
    猜你喜欢
    • 2013-02-25
    • 2021-03-22
    • 2014-02-03
    • 1970-01-01
    • 2012-10-21
    • 1970-01-01
    • 2014-11-09
    • 1970-01-01
    • 2018-06-17
    相关资源
    最近更新 更多