编辑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。
答案 0 :(得分:2)
spaces
方法中的循环错误。你有:
for(int i=0; i<tabs; tabs++)
您几乎肯定希望将tabs++
替换为i++
。否则你的循环将无限期地运行
答案 1 :(得分:0)
唯一的可能是name为null,因此name.length()抛出空指针异常,程序就会死掉。