2010-07-21 3 views
3

java의 System.out.println이 출력을 생성하지 못하는 시나리오는 무엇입니까? 나는 메소드 내부에서 호출을하고 때로는 메소드가 호출 될 때 println과 othertimes를 얻는다.System.out.println이 작동하지 않습니다.

업데이트 : println 뒤에 System.out.flush()도 사용하고 있습니다.

업데이트 : 디버깅 도움 주셔서 감사합니다. 다이얼로그를 열려면 블로킹 콜이 나왔다. 적절한 순서대로 아웃풋을 만들었다. 대화 상자를 닫을 때 메시지를 인쇄하려고하는 메서드가 호출되고 있다고 생각했지만 메서드 자체가 대화를 호출하는 것이므로 닫은 후에 이미 테스트를 시작한 인쇄물을 지나치고있었습니다. 이 질문을 삭제할 수있는 능력이있는 사람은 원래 질문했던 내용이 아니므로 감사하겠습니다.

+1

실행이 println 호출에 도달 했습니까? 그것이 호출되고 있는지 확인하기 위해 디버거에 연결 했습니까? – Fostah

+0

메소드가 호출되고 있습니까? – Freiheit

+1

출력을 쓰지 못하면 통화가 콘솔에 쓰지 못하는 것입니까? 이 경우 'out'스트림이 재 지정되었는지 확인하십시오. –

답변

1

대답에 foo.txt \ BalusC의

suggestion-- 디버깅 도움을 주셔서 감사합니다. 다이얼로그를 열려면 블로킹 콜이 나왔다. 적절한 순서대로 아웃풋을 만들었다.대화 상자를 닫을 때 메시지를 인쇄하려고하는 메서드가 호출되고 있다고 생각했지만 메서드 자체가 대화를 호출하는 것이므로 닫은 후에 이미 테스트를 시작한 인쇄물이 전달되었습니다. 이 질문을 삭제할 수있는 능력이있는 사람은 원래 질문했던 내용이 아니므로 감사하겠습니다.

4

이전에이 시나리오를 본 적이 없습니다. 이론적으로 출력이 예상 한 곳이 아닐 때만 "실패"합니다. 출력 목표는 즉 System#setOut()을 사용하여 변경할 수 있습니다.

+0

참. stdout이나 stderr에서 무작위로 인쇄하는 끔찍한 라이브러리로 작업 할만큼 불행한 경우, 해제 할 방법이 없기 때문에 System.setOut (new PrintStream (new NullOutputStream())); (http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/io/NullOutputStream.html). 나중에 표준 출력을 재설정합니다. 신속하고 더러운 단일 스레드 프로그램을 사용하면 좋습니다. 그러나 이것이 사실이고 어떤 도서관이 이것을하고 있다면, 그것은 더욱 악합니다. –

+0

응용 프로그램의 시작 이후에 stdout이 변경되었는지 확인하기 위해 System.err.println (System.out)을 인쇄 할 수 있습니다. (stderr 자체가 변경된 경우 이는 물론 다른 곳에 인쇄해야합니다.) –

4

System.out.println은 버퍼링 된 출력을 사용합니다. 코드가 수행하는 작업에 따라 프로그램이 종료되기 전에 버퍼가 플러시되지 않을 수도 있습니다. println 뒤에 System.out.flush()을 넣고 도움이되는지 확인해보세요.

편집 :

방법은 내가 println 메소드 내가 어떻게이 메서드가 호출되는 것을 확인하는하지

않는 othertimes를 얻을 수 있지만, println 메소드는 더 생산라고 때때로 때 산출? println에 도착하기 전에 메서드가 Exception (다음에 삼키는)을 던질 가능성이 있습니까?

물론 실제 코드를 보는 것이 도움이 될 것입니다.

+0

[코드] System.out.flush(); System.out.println ("------------------------"); System.out.println ("\ n \ n :: LAT :: ("+ status + ") \ n"); System.out.println ("------------------------"); System.out.flush(); Thread.dumpStack(); [/ code] 상단에 있습니다. 메소드 호출이 성공적으로 호출되고 해당 dumpStacks()가이 메소드를 추적에 표시하기 때문에 메소드가 호출되고 있음을 알고 있습니다. – lathomas64

+0

이 메소드는 다른 메소드 * 만 호출합니까? 여러 스레드가 있습니까? Thread.dumpStack은 System.err이 아닌 System.err로 인쇄하므로 System.err을 비우지 않는 한 스택 덤프가 예상 한 순서대로되지 않을 수 있습니다. –

2

출력물을 어디에서 확인하고 있습니까? System.out이 (가) 다른 위치로 리디렉션되었을 수 있으므로 잘못된 위치에서 찾고있는 것일 수 있습니다.

0

System.out.println은 버퍼링 된 출력입니다. 버퍼를 플러시하지 않으면 프로그램이 끝날 때까지 '대기'하는 것처럼 보일 수 있습니다. 경우에 따라 버퍼를 플러시하기 전에 프로그램이 종료 될 수 있습니다. System.out.flush()는 강제로 출력을 플러시합니다.

0

파일 핸들이 변경되었을 수 있습니다. 즉, stdout의 파일 설명자가 더 이상 1이 아닙니다. 필자는 로깅 유틸리티에서 사람들이 파일 디스크립터에 인쇄 될 수있는 텍스트를 찾아 가고 싶어하지 않는 것을 보았습니다. 대신 스트림을 열린 파일의 파일 핸들로 리디렉션합니다.

여기 파이썬에서 예입니다 : 예상대로

import sys 

h = open(r"C:\foo.txt","a+") 

sys.stdout = h 
sys.stdout.write("hey fellas") 

h.close() 

설명 할 cmdline에서 실행이, 당신은 인쇄 "안녕 친구들"을 얻을 수 있습니다. 대신,이 파일 C로 리디렉션됩니다 : @ 따라

관련 문제