Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 递归方法调用上的StackOverflower错误_Java_Arrays_Recursion_Stack Overflow - Fatal编程技术网

Java 递归方法调用上的StackOverflower错误

Java 递归方法调用上的StackOverflower错误,java,arrays,recursion,stack-overflow,Java,Arrays,Recursion,Stack Overflow,我遇到了以下问题:我想制作一个程序,将数据列表(它将是机场信息,如lat/longditude、ICAO等)转换成一个数据库,从中我不仅可以对它们进行排序,还可以有一种方法为需要不同方式数据的其他程序打印特定脚本 我设法创建了一个列表,将原始数据(来自.txt)按不同的机场进行分割,以便每个元素都包含一个(例如(12921,'CYAC','Cat Lake Airport','CA',51.7272,-91.8244,0,0',))。当我尝试使用一些方法,例如通过调用一个递归方法对列表进行计数,

我遇到了以下问题:我想制作一个程序,将数据列表(它将是机场信息,如lat/longditude、ICAO等)转换成一个数据库,从中我不仅可以对它们进行排序,还可以有一种方法为需要不同方式数据的其他程序打印特定脚本

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

public int getLength(){
    if(next!=null){
        return next.getLength()+1;
    }
    else{
        return 1;
    }
}
机场的数量大约在42000个左右,但它(表面上)创造了42000个物体,很好,只是不想穿过它们


关于如何避免这个错误有什么想法吗?阵列会更智能吗?谢谢你的帮助,问好

因为java堆栈没有那么大,所以会出现堆栈溢出。 您应该使用迭代算法,类似于此:

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

其中MyObject是当前类。

您有两个可能的选项

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

  • >P>(不推荐)通过添加<代码> -xSS100m < /Cord>(或您认为合适的任何其他大小)标志来启动JVM,增加JVM堆栈大小;p>
    循环不是更简单吗?用当前的方法,您将非常快地进入Java。为什么你需要一个递归的解决方案?我用了一个递归的解决方案,因为这是我们在学校学到的最好的。。。显然不是那种尺寸:)你可以让它尾部递归并使用一个。哦,这是一个非常好的主意,非常感谢,我会马上试用它!