Java程序终止于第一个递归级别白色初始化字符串

时间:2016-11-16 00:00:37

标签: java string recursion terminate

编辑2:解决了。没有什么特别的,只是一个错误的for循环。遗憾。

这是我的第一个问题。我目前正在开发一个GUI,以便更轻松地为某个导入软件创建config.xml,我基本上已经为XML编写了一些具有某些限制的数据结构。长话短说,我试着写一个方法作为toString的替代方法,递归打印出格式良好的所有数据。好吧,只要我不进入递归,一切都按计划进行。但是一旦我启用它......

这是代码:

private String details(boolean recursiveDetails, int tabs) {

    if(recursiveDetails) System.out.println("DEBUG: launched details method with depth="+tabs);
    String toStr = space(tabs)+"|============ <"+name+"> ============\n";
    //recursion never reaches this point.
    if(recursiveDetails) System.out.println("Debug check 1: before recursion with depth="+tabs);
    int endlength = 28+name.length();
    toStr += (space(tabs)+"| Parent: "+ parent +"\n");
    if(contentString!=null && !contentString.equals(""))
        toStr += (space(tabs)+"| Content String: \n|    " + contentString+"\n");
    toStr += (space(tabs)+"| Attributes: " + ((allAttr==null||allAttr.size()==0) ? "---" : "") + "\n");
    for(Attribute a : allAttr)
        toStr+=(space(tabs)+"|   "+a+"\n");
    toStr += (space(tabs)+"| Content: " + ((content==null || content.size()==0) ? "---" : "") + "\n");
    //recursion!
    for(Element e : content) 
        toStr+=(space(tabs)+"|" + (recursiveDetails ? e.details(true,tabs+1) : ("   "+e)) + "\n");
    if(recursiveDetails) System.out.println("Debug check 2: after recursion with depth="+tabs);
    toStr += space(tabs)+"|";
    for(int i=0; i<endlength; i++) 
        toStr+="=";
    return toStr;
}

private String space(int tabs) {
    String res="";
    for(int i=0; i<tabs; tabs++)
        res+="   ";
    return res;
}
在递归时,

recursiveDetails是正确的,tabs仅用于缩进。 content是与此方法所在类(Element)相同类型的java.util.List,包含可变数量的Element-objects。每个Element和Attribute对象都有一个有效的toString()方法。

如果我在小型测试结构上使用recursiveDetails = false运行该方法,我会得到:

|============ <Catalog> ============
| Parent: <ImportConfig>
| Attributes: 
|   [Str | Project="null"]
|   [Int | Priority="null"]
| Content: 
|   <Entry>
|   <Entry>
|=================================== 

但是一旦我用recursiveDetails = true运行它,我就明白了:

DEBUG: launched details method with depth=0
Debug check 1: before recursion with depth=0
DEBUG: launched details method with depth=1

使用断点,我发现一切都运行良好,直到println之后的第一行。如果我注释掉该行,程序将在下一行终止,依此类推。没有例外,没有任何东西,没有更多印刷。

我尝试使用StringBuilder,将所有+替换为.append()。我还尝试使用经典a ? b : c来避开if运算符。结果完全一样。

任何人都可以向我解释这个吗?

编辑:我在Ubuntu 16.04 Xenial上使用Java 8 OpenJDK amd64运行Eclipse Java Neon。

2 个答案:

答案 0 :(得分:2)

spaces方法中的循环错误。你有:

for(int i=0; i<tabs; tabs++)

您几乎肯定希望将tabs++替换为i++。否则你的循环将无限期地运行

答案 1 :(得分:0)

唯一的可能是name为null,因此name.length()抛出空指针异常,程序就会死掉。