Java 递归函数中的字符串操作导致堆栈溢出

Java 递归函数中的字符串操作导致堆栈溢出,java,stack-overflow,Java,Stack Overflow,我正在构建一个递归函数,这个函数经过大约一百万行,在执行过程中,我从这个函数中得到stackOverFlow protected String[] getConnectedCities(String line) { return line.trim().toLowerCase().replace(DELIMITER + " ", DELIMITER) .split(DELIMITER); } 这是完整的代码: protected final Map<

我正在构建一个递归函数,这个函数经过大约一百万行,在执行过程中,我从这个函数中得到stackOverFlow

protected String[] getConnectedCities(String line) {
    return line.trim().toLowerCase().replace(DELIMITER + " ", DELIMITER)
            .split(DELIMITER);
}
这是完整的代码:

    protected final Map<String, City> processLine(
        final Map<String, City> dataMap) {
    try {
        String line = "";
        if ((line = bReader.readLine()) == null) {
            return dataMap;
        }
        // Check if direct relation can be found
        String connectedCities[] = parseLine(line);
        line = null;
        saveConnection(dataMap, connectedCities);

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return processLine(dataMap);
}
protectedfinal Map processLine(
最终地图(数据地图){
试一试{
字符串行=”;
if((line=bReader.readLine())==null){
返回数据图;
}
//检查是否可以找到直接关系
字符串connectedCities[]=parseLine(行);
行=空;
保存连接(数据地图、连接城市);
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
返回processLine(dataMap);
}
我不确定我做错了什么,我认为这与弦线有关,但不确定是什么


谢谢。

您做的最后一件事是再次拨打processLine。这将有和文件中的行一样多的重复级别,直到上面的return语句退出。从技术上讲,这是尾部递归,但Java可能不理解这一点。

如果这是向下递归100万级,那么最终不会出现堆栈溢出,需要非常大的堆栈内存区域来处理。你真的想使用递归而不是在循环中一次读取文件行并处理每一行吗?感谢dethorpe的回复,我正考虑将处理时间缩短到日志n,否则处理整个文件需要很长时间。我怀疑这样的递归会比简单地在文件中循环快。也许可以尝试读取文件中较大的块,然后在其中循环,可能使用多个线程来处理Parralel中的块。实际上问题不是读取文件,我使用MappedBufferByte将文件加载到内存中。我的主要问题是如何以更有效的方式处理它。文件是大约200 MB的一行接一行,每行两个单词之间用“,”分隔,谢谢你的回答,Arkedy,我这里主要关心的是将文件的处理时间减少到最小。我想我需要更多地重构代码。