2016-11-16 5 views
1

편집 2 : 해결. 특별한 것은 없지만 for-loop는 잘못되었습니다. 죄송합니다.Java 프로그램은 문자열을 초기화하는 첫 번째 재귀 수준에서 종료합니다.

여기가 내 첫 번째 질문입니다. 나는 현재 특정 수입업자 소프트웨어를위한 config.xml을 쉽게 생성 할 수있는 GUI를 개발 중이고 기본적으로 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() 메서드가 있습니다.

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

을하지만 recursiveDetails = true로 실행하면 나는이 얻을 :

난 작은 테스트 구조에 recursiveDetails = false와 방법을 실행하면, 내가 할 중단 점을 사용

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

을 나는 발견 println 이후의 첫 번째 줄까지 모든 것이 완벽하게 작동합니다. 내가 그 라인을 주석 처리하면, 그 프로그램은 다음 라인에서 종료된다. 예외도없고, 더 이상 인쇄도 없습니다.

대신 +.append()으로 바꿔서 StringBuilder를 사용해 보았습니다. 나는 또한 a ? b : c 연산자를 피하려고 노력했다. 대신 if을 사용했다. 결과는 완전히 동일합니다.

누구든지 나에게 설명 할 수 있습니까?

편집 : Java 8 OpenJDK amd64를 사용하여 Ubuntu 16.04 Xenial에서 Eclipse Java Neon을 실행 중입니다.

+0

실제로 재귀 적 방법으로 어떤 문자열이 반환됩니까? 디버거를 사용하여 우리에게 알려주십시오. 도움이 쉽게 될 것입니다 – nhouser9

+0

아무것도 반환되지 않습니다. 프로그램은 재귀에 들어가 자마자 종료되고'DEBUG : depth = 1로 시작된 세부 사항 메소드 '를 출력합니다. 알고리즘이 재귀를 입력하지 않으면 위의 예에서 볼 수있는 것을 반환합니다. – Dracam

+2

MCVE (http://stackoverflow.com/help/mcve)를 제공하십시오. 코드는 현재 작성된 동작을 나타내지 않아야합니다. – nhouser9

답변

2

spaces 방법의 루프가 잘못되었습니다. 당신은이 :

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

당신은 거의 확실 i++tabs++를 교체합니다. 그렇지 않으면 루프가 무기한 실행됩니다.

+0

음, 이것은 어색합니다. 고맙습니다. 간단한'spaces' 메쏘드가 마지막으로 보았습니다. – Dracam

0

유일한 가능성은 name이 null이므로 name.length()가 null 포인터 예외를 발생시키고 프로그램이 종료되는 것입니다.

+0

예외는 없습니다. 그냥 종료됩니다. 그게 이상한 일이야. – Dracam

+0

포착되지 않은 예외가 발생하거나 JVM이 코어를 덤프합니다. 다른 가능성은 없습니다. –

+0

@ScottSosna 정답이 게시되었고 또 다른 가능성이 있었기 때문에 이것은 이제 아이러니합니다. – nhouser9