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

Java program terminates in first recursion level white initializing a String

编辑 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 是一个 java.util.List,与此方法在 (Element) 中的 class 类型相同,包含可变数量的元素对象。每个元素和属性对象都有一个有效的 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 运算符,而是使用 classic ifs。结果完全一样

谁能给我解释一下?

编辑:我 运行ning Eclipse Java Neon on Ubuntu 16.04 Xenial with Java 8 OpenJDK amd64.

唯一的可能性是 name 为空,因此 name.length() 抛出一个空指针异常并且您的程序终止。

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

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

而且您几乎肯定想用 i++ 替换 tabs++。否则你的循环将 运行 无限期地