2013-11-22 1 views
1

사용자 입력을 읽은 다음 다시 읽는 간단한 프로그램 (코드 하단)이 있습니다. 내 문제에 대한 다른 해결책이 있을지도 모르겠지만, 미래 프로그램에서 유용하기 때문에 이와 같은 것을 사용하고 싶다. 스택 오버플로 문제가 발생했습니다. 나는 이미이 주제 읽기 : - What is a StackOverflowError? -연속 루프가 지속되는 동안 스택 오버플로를 피할 수있는 방법은 무엇입니까?

을 내가 최고 몇 가지 답변을 읽고,하지만 문제는이 프로그램의 목적이기 때문에이 연속 루프를 원하는 것입니다. 루핑을 유지할 수 있도록 내 "스택"을 지울 수있는 방법이 있는지 궁금합니다. 내가 한 번 끝내면 데이터를 보관할 필요가 없습니다. 도움이된다면.

난에서 라인 (15)을 변경하는 경우 그것은 잘 작동 :

for(int y=0;y<System.in.available();++y) 

에 :

for(int y=0;y<10;++y) 

하지만 '그게 읽을 수있는 문자의 양에 엄격한 제한을두고, 나는 돈하고 그걸 원해. 또한 가능한 경우 입력을 가져 오는 (char) System.in.read() 메서드를 계속 사용하는 것이 좋습니다.

내 프로그램은 다음과 같습니다

package main; 

import java.io.IOException; 

public class Root 
{ 
    public static void main(String[] args) 
    { 
     new Root(); 
    } 

    public Root() 
    { 
     try{ 
      for(int y=0;y<System.in.available();++y) 
      { 
       try 
       { 
        System.out.print((char)System.in.read()); 
       } 
       catch (IOException exep) 
       { 
        System.out.print(exep.getLocalizedMessage()); 
       } 
      } 
     } 
     catch(IOException exep) 
     { 
      System.out.println(exep.getLocalizedMessage()); 
     } 
     new Root(); 
    } 

} 
+0

과 대신 정적 메서드합니다

이유에 루트 생성자를 변경할 수 없습니다. – Bernard

+0

Java는 TCO를 지원하지 않으므로 Java의 모든 재귀 함수 호출은 한정된 깊이를가집니다. 명령형 루프 - 'while', 'for'등으로 전환하십시오. – user2864740

+2

루프가 필요한 경우 루프를 사용하지 않는 이유는 무엇입니까? – user2357112

답변

1

당신은 루트 객체를 생성하지만, 실제로 사용하지 않을 것으로 보인다. 무한 재귀는 사용 가능한 각 문자의 실행에 대해 스택 프레임을 스택에 계속 푸시하여 결국 스택 오버플로 예외로 끝납니다. Java는 TCO (tail-call optimization)를 수행하지 않습니다. 생성자 제거, 우선

public Root() 
{ 
    while (true) { 
     try{ 
      for(int y=0;y<System.in.available();++y) 
      { 
       try 
       { 
        System.out.print((char)System.in.read()); 
       } 
       catch (IOException exep) 
       { 
        System.out.print(exep.getLocalizedMessage()); 
       } 
      } 
     } 
     catch(IOException exep) 
     { 
      System.out.println(exep.getLocalizedMessage()); 
     } 
    } 
} 
+0

물론 생성자에서 I/O를 수행하는 것은 매우 나쁜 형식입니다. –

+0

수표를 클릭하지 않았다는 것을 알지 못했습니다. 죄송합니다. 또한, 그것은 내가 위로 버튼을 클릭하게하지 않을 것이다, 나는 더 많은 담당자가 필요하다. – Zac

관련 문제