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 if
s。结果完全一样
谁能给我解释一下?
编辑:我 运行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++
。否则你的循环将 运行 无限期地
编辑 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 if
s。结果完全一样
谁能给我解释一下?
编辑:我 运行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++
。否则你的循环将 运行 无限期地