2012-09-11 4 views
4

나는 다음과 같은 코드가 있습니다자바 예외 스택 추적하지 인쇄

import org.apache.commons.lang.exception.ExceptionUtils; 
public void myMethod() { 
    try { 
     // do something 
    } catch (Exception e) { 
     System.out.println(ExceptionUtils.getStackTrace(e)); // prints "java.lang.NullPointerException" 
     System.out.println(ExceptionUtils.getFullStackTrace(e)); // prints "java.lang.NullPointerException" 
     e.printStackTrace(); // prints "java.lang.NullPointerException" 
    } 
} 

내가보고 싶은 출력은 행 번호와 전체 스택 추적 실패 클래스의 계층 구조입니다. 예를 들어,

Exception in thread "main" java.lang.NullPointerException 
     at org.Test.myMethod(Test.java:674) 
     at org.TestRunner.anotherMethod(TestRunner.java:505) 
     at java.util.ArrayList(ArrayList.java:405) 

이 코드는 log4j에가있는 큰 응용 프로그램 내에서 실행되고,하지만 난 자바에 이메일로 보낼 수 있도록 내가 문자열로 예외를 얻을 수 있기를 바라고 있어요 개발자.

누구든지 전체 스택 추적을 문자열로 캡처하는 방법에 대한 아이디어가 있습니까? 이 응용 프로그램은 Java 4에서 실행되기 때문에 Thread.currentThread(). getStackTrace()를 사용할 수 없습니다. 위의 코드가 전체 스택 트레이스를 인쇄하지 못하게하는 이유는 무엇입니까?

+0

NPE의 StackTraceElement 배열이 비어있는 것으로 표시됩니다. NPE에서 setStackTrace를 호출하는 것이 있습니까? –

+0

@DanGravell - 아니, 아무것도 setStackTrace를 호출해야합니다. – David

+0

IDE에서 이것을 디버깅 할 수 있습니까? 예외가 '완벽하게 형성되었는지'보려면 catch 블록에 중단 점을 설정하는 것이 좋습니다. –

답변

2

예외가 잡힌하고 catch 블록 전에 어딘가에 던져 질 수 있습니다. 어쩌면 당신이 논리를하기 위해 부르는 다른 반에서.


new Exception(new Throwable("java.lang.NullPointerException"));
과 같이 작성된 Exception은 사용자가 보는 것과 같은 것을 인쇄합니다.

+0

try 블록 내부에서 try 블록에 catch 블록이있는 다른 메서드를 호출했음을 알게되었습니다. catch 문은 예외를 명시 적으로 줄였습니다 ("NullPointerException" 스택 트레이스의 원인을 잘라 버렸습니다.) – David

+0

@ David - 나는 다른 제품으로의 전환을 진지하게 고려할 것입니다. 의도적으로 예외 정보를 억압하는 것은 고객/사용자의 최대 이익에 반하는 것입니다. 이 종류의 진절머리 나는 일을하지 않는 대체 공급 업체를 찾으십시오. –

1

콘솔 출력을위한 appender가 없을 수 있습니다. 하나 추가하는 것을 고려하십시오. 그렇지 않으면 LOGGER.error (예)로 로그인하십시오. log4j 또는 SLF4J로

+0

잠시 동안, 나는 그것이 콘솔 로깅으로 인한 것일 수 있다고 생각했다. 그래서 나는 문자열에 예외를 저장하고 그것을 나 자신에게 이메일로 보내려고 시도했다. 이메일에는 "java.lang.NullPointerException" – David

9

반복적으로 예외를 throw하면 JVM이 스택 추적을 채우지 않습니다. 이유는 모르겠지만 JVM의 부하를 줄일 수 있습니다. 세부 정보를 보려면 이전 스택 추적을 조사해야합니다.

for (int n = 0; ; n++) { 
    try { 
     Integer i = null; 
     i.hashCode(); 
    } catch (Exception e) { 
     if (e.getStackTrace().length == 0) { 
      System.out.println("No more stack trace after " + n + " thrown."); 
      break; 
     } 
    } 

인쇄

No more stack trace after 20707 thrown. 
+1

이 포함되어 있었으며 너무 많은 예외가 너무 빨리 발생하여 고마워했습니다. – PUG

1

e.printStackTrace()이 문자열 "java.lang.NullPointerException"을 출력하는 데는 두 가지 이유가 있습니다.

  • 예외로 setStackTrace(new StackTraceElement[0])을 호출했을 수 있습니다.
  • 예외 개체는 잘못된 정보를 반환하기 위해 printStackTrace() 또는 다른 방법을 재정의 한 까다로운 클래스의 인스턴스 일 수 있습니다.
12

java가 서버 모드 (java -server) 에서 이것을 실행할 때 일부 코드 최적화를 수행합니다. 자세한 내용은 아래 링크를 참조 자바 인수에 -XX:-OmitStackTraceInFastThrow를 사용

http://jawspeak.com/2010/05/26/hotspot-caused-exceptions-to-lose-their-stack-traces-in-production-and-the-fix/

+0

프로덕션 서버에서이 최적화를 해제하는 대신 피터의 조언을 따르고 로그의 이전 오류를 살펴볼 것입니다. –

+0

나는 당신이 코드를 소유하고있을 때 할 수 있다는 것에 동의한다. 다른 누군가에게 의존적이라면, 고칠 때까지 할 수있는 최선이다. – vinesh

+0

이것은 분명히 Prod에 나와 비슷한 문제를 일으켰습니다. 답변 감사합니다! – dpetruha

2

사람이 내가 문자열의 전체 스택 추적을 캡처 할 수있는 방법에 대한 아이디어가 있습니까?

아래의 방법 (StringWriter.toString())을 사용하여 스택 추적을 String으로 전송할 수 있습니다.

StringWriter writer = new StringWriter(); 
e.printStackTrace(new PrintWriter(writer,true)); 
System. out.println("exeption stack is :\n"+writer.toString());